我在熊猫中合并了2个DataFrame,它们都包含相同的列,但在某些行上具有不同的值。例如:
df1:
A B
1 x
2 y
3 z
df2: A B
1 x, y
2 y, x, z
4 z
df = pd.merge(df1, df2, how='inner', on=['A']
我期望输出这样的行:
df:
A B
1 x, y
2 x, y, z
但是,相反,我得到了这样的东西:
df:
A B_x B_y
1 x x, y
2 y y, x, z
有什么办法可以像我想要的那样获得输出吗?我知道我可以将B_x和B_y都合并到一个新列中,然后删除B_x和B_y列,但是输出将与我想要的相同:
df['B'] = df['B_x'] +', '+ df[B_y']
df.drop(columns=['B_x', 'B_y']
#The output then will look like this:
df:
A B
1 x, x, y
2 y, x, y, z
如果我像这样组合这些列,有什么方法可以从同一行中删除重复的值?还是以某种方式获得自开始以来我想要的输出?抱歉,如果答案太明显了,但是我是新来的熊猫人(而且编程经验也不丰富),但是如果您可以回答我,那将非常有帮助。 谢谢!
答案 0 :(得分:0)
使用suffixes
在左侧和右侧添加重叠的列名称,并放置重叠的列。
(
pd.merge(df1, df2, how='inner', on=['A'], suffixes=("_x", ""))
.drop(columns=["B_x"])
)
A B
0 1 x, y
1 2 y, x, z
答案 1 :(得分:0)
我的建议是将B列expand
分成多列,然后melt
。
# Original data
df1 = pd.DataFrame({'A': [1,2,3], 'B': ['x', 'y', 'z']})
df2 = pd.DataFrame({'A': [1,2,4], 'B': ['x, y', 'y, x, z', 'z']})
# Expand and melt second dataframe
df22 = (
pd.concat([df2.A, df2.B.str.split(', ', expand=True)], axis=1)
.melt('A', value_name='B')
.drop(columns=['variable'])
.dropna()
)
# Concatenate data frames and aggreagate
df = (
pd.concat([df1, df22])
.drop_duplicates()
.groupby('A')
.agg(lambda x: ', '.join(x))
.reset_index()
)
df = df[df['A'].isin(df1['A']) & df['A'].isin(df2['A'])]
print(df)
将输出
A B
0 1 x, y
1 2 y, x, z