合并数据框,同时删除重复项
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 并将其与 Car
和 Month
的值组合在 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
希望对您有所帮助
我无法理解合并和加入。
我有一个初始数据框,如下所示:
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 并将其与 Car
和 Month
的值组合在 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
希望对您有所帮助