合并数据框,同时删除重复项

Merge dataframes while removing duplicates

我无法理解合并和加入。

我有一个初始数据框,如下所示:

 Car    Units Month
 BMW     800   Jan
 Lexus   150   Jan
 Audi    210   Feb
 Mustang 90    Mar
 Bentley 110   Feb
 Jaguar  90    Jan

我将陆续获取更多数据帧以附加到此初始 df。

我将只附加那些在 'Car' 列和 'Month' 列中唯一的值。

假设我要附加另一个数据框:

Car   Units Month
BMW     130   Jan
Tata    150   Jan
Maruti  110   Mar
Audi    250   Mar

期望的输出: 当我将第二个数据帧附加到第一个数据帧时,应该附加 'Tata'、'Maruti'、'Audi'。 'BMW' 不应附加。

我使用的代码是:

import pandas as pd


df1 = pd.DataFrame(
   {
      "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Bentley', 'Jaguar'],"Units": [800, 150, 210, 90, 110, 90], "Month": ['Jan','Jan', 'Feb', 'Mar', 'Feb', 'Jan']
   }
)

df2 = pd.DataFrame(
   {
      "Car": ['BMW', 'Tata', 'Maruti', 'Audi'],"Units": [130, 150, 110, 250], "Month": ['Jan','Jan','Mar', 'Mar']
   }
)


df1 = pd.merge(df1, df2, on=['Car', 'Month'], how="left", indicator=False)

但不知何故它不起作用。

使用“left”只会影响 ['Car', 'Month'] 使用左边的键。

一种解决方案是使用 outer 来获得 ['Car', 'Month'] 键的所有组合。我将指示器设置为 true 值的来源,并将 left 设置为没有后缀,以便我们稍后可以利用它:

joined=pd.merge(df1, df2, on=['Car', 'Month'],
                how="outer", indicator=True, suffixes=["", "_y"])
>> joined

       Car  Units Month  Units_y      _merge
0      BMW  800.0   Jan    130.0        both
1    Lexus  150.0   Jan      NaN   left_only
2     Audi  210.0   Feb      NaN   left_only
3  Mustang   90.0   Mar      NaN   left_only
4  Bentley  110.0   Feb      NaN   left_only
5   Jaguar   90.0   Jan      NaN   left_only
6     Tata    NaN   Jan    150.0  right_only
7   Maruti    NaN   Mar    110.0  right_only
8     Audi    NaN   Mar    250.0  right_only

选择单位列:

units = joined.filter(regex="^Units", axis=1)

>> units

   Units  Units_y
0  800.0    130.0
1  150.0      NaN
2  210.0      NaN
3   90.0      NaN
4  110.0      NaN
5   90.0      NaN
6    NaN    150.0
7    NaN    110.0
8    NaN    250.0

然后,因为你想让left上的结果优先,你可以在水平方向上填充Nan,所以如果Units上有任何值(来自左边的值),它们将被保留:

 filled_units = units.fillna(axis=1, method='bfill')

 >> filled_units

   Units  Units_y
0  800.0    130.0
1  150.0      NaN
2  210.0      NaN
3   90.0      NaN
4  110.0      NaN
5   90.0      NaN
6  150.0    150.0
7  110.0    110.0
8  250.0    250.0

最后,我们可以切片 filled_units 并将其与 CarMonth 的值组合在 joined:

pd.concat([joined[['Car', 'Month']], filled_units["Units"]], axis=1)

       Car Month  Units
0      BMW   Jan  800.0
1    Lexus   Jan  150.0
2     Audi   Feb  210.0
3  Mustang   Mar   90.0
4  Bentley   Feb  110.0
5   Jaguar   Jan   90.0
6     Tata   Jan  150.0
7   Maruti   Mar  110.0
8     Audi   Mar  250.0

希望对您有所帮助