【问题标题】:Python: Simplest way to join two DataFrames by unique combinations?Python:通过唯一组合连接两个 DataFrame 的最简单方法?
【发布时间】:2021-01-10 07:52:49
【问题描述】:

我有两个 DataFrame:

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

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

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

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

我可以在 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 还很陌生)。

有没有一种很好且“易于理解”的方法?

【问题讨论】:

    标签: python pandas dataframe join spyder


    【解决方案1】:

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

    【讨论】:

    • 效果很好!谢谢解释^^
    • @Jacob 已经很好地解释了它。您可以查看我的答案以了解如何编写代码。
    【解决方案2】:

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

    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]
    

    【讨论】:

      猜你喜欢
      • 2014-09-05
      • 2019-06-26
      • 2012-01-09
      • 2011-07-27
      • 2018-03-16
      • 2015-09-29
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多