Python:通过唯一组合连接两个 DataFrame 的最简单方法?

Python: Simplest way to join two DataFrames by unique combinations?

我有两个数据框:

fuels = pd.DataFrame({'Fuel_Type':['Gasoline', 'Diesel', 'E85']})

years = pd.DataFrame()
years['Year_Model'] = range(2012, 2041)

我想要的输出是一个新的 DataFrame,它将这两个数据帧组合成两列,但是对于 'years' 中的每个值,对 'fuels' 中的每种独特燃料类型重复它。

换句话说,每个不同的年份应该重复三次,每种燃料重复一次。

我可以在 R 中非常简单地做到这一点:

df <- merge(
         data.frame(years = c(2012:2040)),
         data.frame(fuels = c("Gasoline", "Diesel", "E85")),
         allow.cartesian = T)

我查看了类似问题的答案,例如:

Create all possible combinations of multiple columns in a Pandas DataFrame

cartesian product in pandas

但是,要么我似乎无法将答案的代码应用到我自己的数据中,要么答案太复杂以至于我无法理解(因为我是 Python 的新手)。

有什么好的 'easy to understand' 方法可以做到这一点吗?

您发布的第二个 link 有一个很好的解决方案,但它还有很多其他内容,因此如果您是 python 的新手,可能很难提取。你想要:

df = fuels.assign(key=0).merge(years.assign(key=0), on = 'key').drop('key', 1)

这是一种圆滑的方式,因为我们同时在做几件事。我们实质上是在每个数据帧中添加一列 0,加入其中,然后删除该列。下面是它的分解步骤:

fuels = fuels.assign(key=0) #add a 'key' column to fuels with all 0s for values
years = years.addign(key=0) #add a 'key' column to years with all 0s for values
df = fuels.merge(years, on = 'key') #sql-style join on the key column
df = df.drop('key', 1) #get rid of the key column in the final product

merge 方法默认为内部联接,因此我们不需要指定,因为这样就可以了。我们只需要告诉它使用 on = 'key' 加入右列。 .drop('key', 1) 中的 1 告诉它删除称为键(1 轴)的 ,如果我们没有指定 (.drop('key')),或者给出它是 0 (.drop('key', 0)),它会尝试删除一个名为 key.

row

以下答案应该对您有所帮助:

import pandas as pd


fuels = pd.DataFrame({'Fuel_Type': ['Gasoline', 'Diesel', 'E85']})

years = pd.DataFrame()
years['Year_Model'] = range(2012, 2041)
fuels['key'] = 1
years['key'] = 1


print(pd.merge(fuels, years, on='key').drop("key", 1))

输出:

   Fuel_Type Year_Model
0   Gasoline       2012
1   Gasoline       2013
2   Gasoline       2014
3   Gasoline       2015
4   Gasoline       2016
..       ...        ...
82       E85       2036
83       E85       2037
84       E85       2038
85       E85       2039
86       E85       2040

[87 rows x 2 columns]