我有 df1:
ID B C
1 1 a
2 2 b
3 3 c
4 1 a
df2:
ID B
5 1
6 2
7 3
8 1
我想把它们组合起来,这样我就可以得到 df3:
ID B C
1 1 a
2 2 b
3 3 c
4 4 d
5 1 a
6 2 b
7 3 c
8 1 a
ID 具有唯一值(不重复) B 和 C 具有重复值并匹配。例如,当 B=1 时,C 总是等于 a。
到目前为止,我尝试了不同的方法。
df3=df1.merge(df2,how='outer')
df3=df3.groupby('B',as_index=False).fillna( method ='ffill')
但 B 和 C 不匹配。
是否有其他方法或如何修复我当前的方法?
感谢您的回答。
答案 0 :(得分:1)
您需要选择用于前向填充和分配的列:
df3=df1.merge(df2,how='outer')
#if missing values are in first place get them to back
df3 = df3.sort_values('C')
df3['C'] = df3.groupby('B')['C'].ffill()
df3 = df3.sort_index()
print (df3)
ID B C
0 1 1 a
1 2 2 b
2 3 3 c
3 4 1 a
4 5 1 a
5 6 2 b
6 7 3 c
7 8 1 a
答案 1 :(得分:1)
您可以连接数据,然后使用从 df1 到 B 列到 C 列的映射来填充空值:
mapping = df1.drop_duplicates("B").set_index("B").C
pd.concat([df1, df2], ignore_index=True).assign(C=lambda df: df.B.map(mapping))
ID B C
0 1 1 a
1 2 2 b
2 3 3 c
3 4 1 a
4 5 1 a
5 6 2 b
6 7 3 c
7 8 1 a
答案 2 :(得分:1)
如果 B 始终相同,我认为您的第三张屏幕截图中有错误?
如果这些是正确的数据帧:
df1 = pd.DataFrame({"ID": [1, 2, 3, 4], "B": [1, 2, 3, 1], "C": ["a", "b", "c", "a"]})
df2 = pd.DataFrame({"ID": [5, 6, 7, 8], "B": [1, 2, 3, 1]})
那么你就很接近了,你只需要根据 df3["C"]
中对应的唯一值创建 B
列:
首先合并并查看NaNs
df3 = df1.merge(df2, how="outer")
print(df3)
ID B C
0 1 1 a
1 2 2 b
2 3 3 c
3 4 1 a
4 5 1 NaN
5 6 2 NaN
6 7 3 NaN
7 8 1 NaN
然后通过填充前几行的 C
->B
对应关系来创建列 C
:
df3["C"] = df3.groupby("B")["C"].fillna(method="ffill")
print(df3)print(df3)print(df3)
ID B C
0 1 1 a
1 2 2 b
2 3 3 c
3 4 1 a
4 5 1 a
5 6 2 b
6 7 3 c
7 8 1 a