组合具有不同列的 2 个数据集并填充值

时间:2021-01-19 07:37:58

标签: python pandas dataframe rows

我有 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 不匹配。

是否有其他方法或如何修复我当前的方法?

感谢您的回答。

3 个答案:

答案 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
相关问题