当前位置: 首页 > 知识库问答 >
问题:

熊猫左加入和更新现有的列

龚睿
2023-03-14

我刚接触熊猫,似乎无法使用合并功能:

>>> left       >>> right
   a  b   c       a  c   d 
0  1  4   9    0  1  7  13
1  2  5  10    1  2  8  14
2  3  6  11    2  3  9  15
3  4  7  12    

对于列a上的左连接,我想通过连接键更新公共列。注:c列中的最后一个值来自左表,因为不存在匹配项。

>>> final       
   a  b   c   d 
0  1  4   7   13
1  2  5   8   14
2  3  6   9   15
3  4  7   12  NAN 

我应该如何使用Pandas merge函数来实现这一点?非常感谢。

共有3个答案

习旻
2023-03-14

另一种方法是这样使用pd.merge:

 >>> import pandas as pd

 >>> final = pd.merge(left=right, right=left, 
                      how='outer',
                      left_index=True,
                      right_index=True,
                      on=('a', 'c')
                     ).sort_index(axis=1)

 >>> final       
    a  b   c   d 
 0  1  4   7   13.0
 1  2  5   8   14.0
 2  3  6   9   15.0
 3  4  7   12  NaN 

为函数的“on=”参数提供两个dataframe列的交集。

这不会像Zero的解决方案那样创建必须删除的不需要的列。

NaN值可能会将同一列中的整数更改为浮点数。

编辑:这适用于熊猫版本

单于山
2023-03-14

一种方法是将a列设置为索引并更新:

In [11]: left_a = left.set_index('a')

In [12]: right_a = right.set_index('a')

注意:更新只执行左连接(而不是合并),所以set_index您还需要包括left_a中没有的附加列。

In [13]: res = left_a.reindex(columns=left_a.columns.union(right_a.columns))

In [14]: res.update(right_a)

In [15]: res.reset_index(inplace=True)

In [16]: res
Out[16]:
   a   b   c   d
0  1   4   7  13
1  2   5   8  14
2  3   6   9  15
3  4   7  12 NaN
湛文乐
2023-03-14

您可以使用a'列上的how='left'leftright之间使用merge()

In [74]: final = left.merge(right, on='a', how='left')

In [75]: final
Out[75]:
   a  b  c_x  c_y   d
0  1  4    9    7  13
1  2  5   10    8  14
2  3  6   11    9  15
3  4  7   12  NaN NaN

NaN值从c_y替换为c_x

In [76]: final['c'] = final['c_y'].fillna(final['c_x'])

In [77]: final
Out[77]:
   a  b  c_x  c_y   d   c
0  1  4    9    7  13   7
1  2  5   10    8  14   8
2  3  6   11    9  15   9
3  4  7   12  NaN NaN  12

删除不需要的列,就会得到结果

In [79]: final.drop(['c_x', 'c_y'], axis=1)
Out[79]:
   a  b   d   c
0  1  4  13   7
1  2  5  14   8
2  3  6  15   9
3  4  7 NaN  12
 类似资料:
  • 问题内容: 我是熊猫的新手,似乎无法将此功能与merge函数配合使用: 在列a左连接时,我想通过JOINED KEYS更新公共列。请注意,c列中的最后一个值来自LEFT表,因为没有匹配项。 如何使用Pandas合并功能执行此操作?谢谢。 问题答案: 一种方法是将a列设置为索引和: 注意:仅执行左联接(不合并),因此,除了set_index之外,还需要包括中不存在的其他列。

  • 问题内容: 我有一个数据框df,有两列,我想按一列分组并加入属于同一组的列表,例如: 处理后: 我想保留所有重复项。我有以下问题: 数据框的dtype是对象。convert_objects()不会自动将column_b转换为列表。我怎样才能做到这一点? df.groupby(…)。apply(lambda x:…)中的函数适用于什么?x的形式是什么?清单? 我主要问题的解决方案? 提前致谢。 问题

  • 问题内容: 我正在做一些地理编码工作,我曾用它来屏幕刮取位置地址所需的xy坐标,我将xls文件导入了panda数据框,并希望使用显式循环来更新没有xy坐标的行,例如下面: 我已经阅读了为什么在遍历熊猫DataFrame之后该功能不能“使用”?并且完全意识到,iterrow仅提供给我们一个视图,而不是一个供编辑的副本,但是如果我真的要逐行更新值怎么办?是否可行? 问题答案: 您从中获得的行是不再连接

  • 问题内容: 我每周有一些设备的日志数据。对于某些设备,它从星期一开始,对于某些设备,它在星期三开始,等等。有时此数据中有〜月的间隔,但是我希望DataFrame索引仍然包含每周具有NaN值的行。 我正在尝试在Python中使用,但是我无法获得期望的结果。 例: 是)我有的: 我期望/想要的(请注意带有NaN的2个新行): 我得到的是: 因此,我获得了每个星期日的所有值和日期。但是我不需要每个星期天

  • 我的数据记录如下所示 我想在forloop中向我的数据表添加新行(不是循环现有的数据表) 但这种方法行不通。如何向现有数据目录添加新行?

  • 问题内容: 如果“文件名”不存在,我想使用pd.write_csv写入“文件名”(带有标题),否则,如果存在“文件名”,则附加到文件名中。如果我只使用命令: 写入或追加成功,但似乎每次进行追加时都会写入标头。 如果文件不存在,如何只添加标题,如果文件存在,如何不添加标题而追加标题? 问题答案: 不确定熊猫是否有办法,但是检查文件是否存在将是一种简单的方法: