gpt4 book ai didi

python - Pandas:根据列数据合并或连接数据框?

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

我正在尝试将几列数据添加到现有数据框中。数据帧本身是由许多其他数据帧构建的,我成功地将它们加入到索引上,它们是相同的。为此,我使用了这样的代码:

    data = p_data.join(r_data)

我实际上在多索引上加入了这些,因此数据框看起来如下所示,其中 Name1 和 Name 2 是索引:

    Name1    Name2    present    r      behavior
a 1 1 0 0
2 1 .5 2
4 3 .125 1
b 2 1 0 0
4 5 .25 4
8 1 0 1

因此,Name1 索引不会重复数据,但 Name2 索引会重复数据(我使用它来跟踪二元组,以便 Name1 和 Name2 一起仅表示一次)。我现在要添加的是与 Name2 数据(有关二元组第二个成员的信息)相对应的 4 列数据。与“当前”“r”和“行为”数据不同,这些数据是针对个体的,而不是针对二元组的。所以合并时我不需要考虑Name1数据。

问题是,虽然重复 Name2 数据以耗尽二元组合,但我现在要添加的数据中的“Name2”列只有每个 Name2 个体的一条数据:

    Name2    Data1    Data2    Data3
1 80 6 1
2 61 8 3
4 45 7 2
8 30 3 6

我希望输出如下:

    Name1    Name2    present    r      behavior    Data1    Data2    Data3
a 1 1 0 0 80 6 1
2 1 .5 2 61 8 3
4 3 .125 1 45 7 2
b 2 1 0 0 61 8 3
4 5 .25 4 45 7 2
8 1 0 1 30 3 6

尽管阅读了文档,但我不清楚是否可以使用 join() 或 merge() 来获得所需的结果。如果我尝试像我之前使用的简单数据框一样连接到现有数据框,我最终会得到新列,但它们充满了 NaN 值。我还尝试了使用 Name1 和 Name2 作为列或索引的各种组合,以及连接或合并(不像听起来那么随机,但我显然没有正确解释文档!)。非常感谢您的帮助,因为我目前非常迷失。

最佳答案

我不确定这是否是最好的方法,但您可以使用 reset_index 临时使原始 DataFrame 仅由 Name2 建立索引。然后您可以照常执行join。然后使用 set_index 再次使 Name1 成为 MultiIndex 的一部分:

import pandas as pd

df = pd.DataFrame({'Name1':['a','a','a','b','b','b'],
'Name2':[1,2,4,2,4,8],
'present':[1,1,3,1,5,1]})
df.set_index(['Name1','Name2'], inplace=True)

df2 = pd.DataFrame({'Data1':[80,61,45,30],
'Data2':[6,8,7,3]},
index=pd.Series([1,2,4,8], name='Name2'))
result = df.reset_index(level=0).join(df2).set_index('Name1', append=True)
print(result)
# present Data1 Data2
# Name2 Name1
# 1 a 1 80 6
# 2 a 1 61 8
# b 1 61 8
# 4 a 3 45 7
# b 5 45 7
# 8 b 1 30 3

为了使结果看起来更像您想要的 DataFrame,您可以对索引进行重新排序和排序:

print(result.reorder_levels([1,0],axis=0).sort(axis=0))
# present Data1 Data2
# Name1 Name2
# a 1 1 80 6
# 2 1 61 8
# 4 3 45 7
# b 2 1 61 8
# 4 5 45 7
# 8 1 30 3

关于python - Pandas:根据列数据合并或连接数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19647808/

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