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

2024-05-15 08:56:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧:

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

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

我所期望的输出是一个新的数据框,它将这两个数据框组合为两列,但对于“年”中的每个值,请对“燃料”中的每个独特燃料类型重复该输出

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

我可以很简单地在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

Performant cartesian product (CROSS JOIN) with pandas

cartesian product in pandas

但是,要么我似乎无法将答案的代码应用于我自己的数据,要么答案太复杂,我无法理解(因为我对Python非常陌生)

有没有一种好的、易于理解的方法


Tags: 数据答案in类型dataframedataframepd
2条回答

您发布的第二个链接有一个很好的解决方案,但它还有很多其他内容,因此如果您是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)),它将尝试删除调用的键

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

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]

相关问题 更多 >