我正在尝试将几列数据添加到现有数据框中。数据框本身是从许多其他数据框架构建的,我成功地加入了相同的索引。为此,我使用了这样的代码:
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一起只表示一次)。我现在想要添加的是4列数据,这些数据对应于Name2数据(有关二元组第二个成员的信息)。与“当前”“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作为列或索引的各种组合,使用连接或合并(不是听起来随机,但我显然没有正确解释文档!)。非常感谢你的帮助,因为我现在非常失落。
答案 0 :(得分:1)
我不确定这是否是最佳方式,但您可以使用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