Python 如何删除Pandas中同一行上的重复值?

Python 如何删除Pandas中同一行上的重复值?,python,pandas,Python,Pandas,我在pandas中合并了两个数据帧,它们都包含相同的列,但在某些行上具有不同的值。例如: 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

我在pandas中合并了两个数据帧,它们都包含相同的列,但在某些行上具有不同的值。例如:

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
但我得到的却是这样的东西:

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 
如果我这样组合这些列,有没有办法从同一行中删除重复的值?或者任何一种方法来获得像我从beggining开始想要的那样的输出?。很抱歉,如果答案太明显,但我是新使用熊猫的(而且在编程方面也不是很有经验),但是如果你能回答我,这将非常有帮助。
谢谢

使用
后缀
在左侧和右侧添加重叠列名的后缀,并删除重叠列

(
    pd.merge(df1, df2, how='inner', on=['A'], suffixes=("_x", ""))
        .drop(columns=["B_x"])
)


使用
后缀
在左侧和右侧添加重叠列名的后缀,并删除重叠列

(
    pd.merge(df1, df2, how='inner', on=['A'], suffixes=("_x", ""))
        .drop(columns=["B_x"])
)


我的建议是
将B列扩展为多个列,然后
将其熔化

# 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

我的建议是
将B列扩展为多个列,然后
将其熔化

# 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

如果
df1
中的一行包含在
df2
中的“B”中找不到的“a”的“B”值,该怎么办?我希望它们是相加的。例如,对于每个数据帧中相同的“A”值,假设df1的“B”值为“x”,df的“B”值为“y,z”。我希望合并数据帧(df)的“B”值为“x,y,z”。因此,列中
B
的数据类型基本上是一组字符串,对吗?是的,就是这样!如果
df1
中的一行包含在
df2
中的“B”中找不到的“a”的“B”值,该怎么办?我希望它们是相加的。例如,对于每个数据帧中相同的“A”值,假设df1的“B”值为“x”,df的“B”值为“y,z”。我希望合并数据帧(df)的“B”值为“x,y,z”。因此,列中
B
的数据类型基本上是一组字符串,对吗?是的,就是这样!我尝试了这个方法,但结果只保留了df2中的“B”列。我想要的是创建一个新的数据帧,它组合了两个“B”列(例如,如果对于相同的“a”,我们在df1中有“x,y”的“B”值,而在df2中有“y,z”,我希望新的df有“x,y,z”),我尝试了这个方法,但结果只保留了df2中的“B”列。我想要的是创建一个新的数据帧,它组合了两个“B”列(例如,如果对于同一个“a”,我们在df1中有“x,y”的“B”值,在df2中有“y,z”,我希望新的df有“x,y,z”),我尝试这样做,但不知何故,我总是在a上有一个keyrerror,所以我不知道我是否做错了什么,你是在虚拟数据帧上还是在你正在处理的实际数据帧上得到了这个错误?您应该用A和B替换正在处理的数据集的真实列名。另外,在代码的哪个步骤中出现此错误?我尝试这样做,但不知怎的,我总是以A上的键错误结束,所以我不知道我是否做错了什么,你是在虚拟数据帧上还是在你正在处理的实际数据帧上得到了这个错误?您应该用A和B替换正在处理的数据集的真实列名。另外,在代码的哪个步骤中会出现此错误?