gpt4 book ai didi

python - 如何使用 python pandas 连接 DataFrame 而不重复列并保持默认的左或非 NaN?

转载 作者:行者123 更新时间:2023-11-30 22:11:37 25 4
gpt4 key购买 nike

我想合并索引上的两个 DataFrame(因此 join())。
但这两个 DataFrame 大约有 20 列,完全相同。我希望避免重复的列,因为决定保留哪些列,删除其中一半并重命名其他列可能会很麻烦。

我的目标是制作一个 DataFrame(我称之为“旧”)作为所有先前 DataFrame 的历史。因此,我正在构建一个新的数据帧,然后将其合并到旧的数据帧中,等等。旧的数据帧将随着迭代的时间而增加。

这是一个简化的示例

import pandas as pd
df = pd.DataFrame({'A': [1,2,3],
'B': [4,5,6],
'C':[7,8,9]}
).set_index([[11,22,33]])

old = df.head(2)
new = df.tail(2)

print( old.join(new,how='outer', lsuffix='_left') )

这给出:

    A_left  B_left  C_left    A    B    C
11 1.0 4.0 7.0 NaN NaN NaN
22 2.0 5.0 8.0 2.0 5.0 8.0
33 NaN NaN NaN 3.0 6.0 9.0
  • 11:我知道如果 ID 不存在于 new 中,则应该保留它,而不是使用 NaN 创建重复变量。

  • 22:如果两者都存在该ID,则应覆盖旧值;丢弃 _left 列,保留 _right 列。

  • 33:如果旧的ID不存在但新的ID存在,则追加

我为此在文档中搜索了很多,但找不到任何东西。

到目前为止,我最好的想法是使用后缀进行连接,然后应用过滤器:如果列 A_left、B_left C_left 为 NaN,则复制 A、B、C 中的值。删除列A_left、B_left C_left等
这似乎不是一个高效的解决方案。

或者也许附加它们,排序值,然后删除重复的 id?

由于我是 Python 新手,这可能不是最好的方法,请告诉我。

最佳答案

------------------评论后编辑-------------------------- -----

第一个选项,完整代码:它保留两者的索引,同时使用新值更新具有相同索引但不同值的行。

import pandas as pd
old = pd.DataFrame({'A': [2,3,4],
'B': [5,6,4],
'C':[8,9,4]}
).set_index([[22,33,44]])

new = pd.DataFrame({'A': [1,2,3],
'B': [44,55,66],
'C':[7,8,9]}
).set_index([[11,22,33]])

new
A B C
11 1 44 7
22 2 55 8
33 3 66 9

old
A B C
22 2 5 8
33 3 6 9
44 4 4 4

pd.merge(new, old, on=['A','B','C'], how='outer', right_index=True, left_index=True)

output:
A B C
11 1 44 7
22 2 55 8
33 3 66 9
44 4 4 4
<小时/>

你尝试过合并吗?

    pd.merge(old, new, on=['A','B','C'], how='outer', left_index=True, right_index=True))

Output:

A B C
11 1 4 7
22 2 5 8
33 3 6 9

选项 2:使用追加和删除重复项:

new.append(old).drop_duplicates()

关于python - 如何使用 python pandas 连接 DataFrame 而不重复列并保持默认的左或非 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51361994/

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