gpt4 book ai didi

python - 如何避免 Pandas.Merge 上出现多列

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:52 25 4
gpt4 key购买 nike

假设我在 Pandas 上有以下 DataFrame:

In [7]: A= pd.DataFrame([['foo'],['bar'],['quz'],['baz']],columns=['key'])

In [8]: A['value'] = 'None'

In [9]: A
Out[9]:
key value
0 foo None
1 bar None
2 quz None
3 baz None

In [10]: B = pd.DataFrame([['foo',5],['bar',6],['quz',7]],columns= ['key','value'])

In [11]: B
Out[11]:
key value
0 foo 5
1 bar 6
2 quz 7

In [12]: pd.merge(A,B, on='key', how='outer')
Out[12]:
key value_x value_y
0 foo None 5
1 bar None 6
2 quz None 7
3 baz None NaN

但我想要的是(基本上避免重复列):

   key  value
0 foo 5
1 bar 6
2 quz 7
3 baz NaN

我想我可以获取输出并删除 _x 值并重命名 _y 但这似乎有点矫枉过正。在 SQL 上,这将是微不足道的。

编辑:

约翰推荐使用:

In [1]: A.set_index('key', inplace=True)
A.update(B.set_index('key'), join='left', overwrite=True)
A.reset_index(inplace=True)

这有效并且符合我的要求。

最佳答案

在示例中,您将两个数据框与同一列合并,其中一个包含字符串(“无”),其他为整数,pandas 不知道您想要保留哪一列值以及应该替换哪一列值,因此它创建了一个两者的列。

您可以使用更新代替

In [10]: A.update(B, join='left', overwrite=True)
In [11]: A
Out[11]:

key value
0 foo 5
1 bar 6
2 quz 7
3 baz NaN

另一种解决方案是仅声明给定列所需的值:

In [15]: A.loc[B.index, 'value'] = B.value
In [16]: A
Out[16]:

key value
0 foo 5
1 bar 6
2 quz 7
3 baz NaN

我个人更喜欢第二种解决方案,因为我确切地知道发生了什么,但第一个解决方案可能更接近您在问题中寻找的内容。

编辑:

如果索引不匹配,我不太确定如何实现这一点。因此我建议让它们匹配:

In [1]: A.set_index('key', inplace=True)
A.update(B.set_index('key'), join='left', overwrite=True)
A.reset_index(inplace=True)

可能有更好的方法来做到这一点,但我不相信 pandas 有办法直接执行此操作。

第二种解决方案也可以与更新后的索引一起使用:

In [24]: A.set_index('key', inplace=True)
A.loc[B.key, 'value'] = B.value.tolist()

关于python - 如何避免 Pandas.Merge 上出现多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35275986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com