如何删除熊猫同一行上的重复值?

时间:2020-07-20 17:08:49

标签: python pandas

我在熊猫中合并了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 

如果我像这样组合这些列,有什么方法可以从同一行中删除重复的值?还是以某种方式获得自开始以来我想要的输出?抱歉,如果答案太明显了,但是我是新来的熊猫人(而且编程经验也不丰富),但是如果您可以回答我,那将非常有帮助。 谢谢!

2 个答案:

答案 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