【问题标题】:Complicated pandas merge operation复杂的 pandas 合并操作
【发布时间】:2014-01-05 07:28:11
【问题描述】:

我对在 Pandas 中加入/合并数据还是很陌生,因此非常感谢任何帮助来执行以下操作。我有以下三个数据的 SQL 表(转换为 DataFrames):

df1
Out[14]:
---- fruit price qty
2010 apple 1.0 2.0
2011 apple 3.0 4.0
2010 banana 0.5 1.5
2011 banana 7.0 8.0

df2
Out[15]:
---- fruit weight
2010 apple 10
2010 banana 12

df3
Out[16]:
-- fruit colour
0 apple red
1 banana yellow

df2 的结果与 df​​1 相同,但年份不同(我几乎完全确定 df2 的年份是 df1 的一个子集,尽管找到一种方法会很好,它允许 df2 中的年份不包含在 df1) 中。 df3 是一个表格,其中包含 df2 和 df1 中包含的所有水果的字符。我想将这三个表合并在一起,因此新组合 DataFrame 中的每一行都有年份、水果、价格、数量、重量(可能是 NaN)和颜色。我不确定这样的数据结构是否最好包含在 Panel 或 DataFrame 中 - 对此的输入也非常受欢迎。谢谢!

【问题讨论】:

    标签: python join merge pandas


    【解决方案1】:

    为了确保年份没有问题,我会先 reset_index:

    In [11]: df1.index.name = 'year'
    
    In [12]: df2.index.name = 'year'
    
    In [13]: df1.reset_index(inplace=True)
    
    In [14]: df2.reset_index(inplace=True)
    
    In [15]: df1
    Out[15]: 
       year   fruit  price  qty
    0  2010   apple    1.0  2.0
    1  2011   apple    3.0  4.0
    2  2010  banana    0.5  1.5
    3  2011  banana    7.0  8.0
    
    [4 rows x 4 columns]
    
    In [16]: df2
    Out[16]: 
       year   fruit  weight
    0  2010   apple      10
    1  2010  banana      12
    
    [2 rows x 3 columns]
    

    现在你可以通过合并(两次)得到你的结果:

    In [17]: df1.merge(df2, how='left').merge(df3, how='left')
    Out[17]: 
       year   fruit  price  qty  weight  colour
    0  2010   apple    1.0  2.0      10     red
    1  2011   apple    3.0  4.0     NaN     red
    2  2010  banana    0.5  1.5      12  yellow
    3  2011  banana    7.0  8.0     NaN  yellow
    
    [4 rows x 6 columns]
    

    如果您确信只有一个重量的水果(即与年份无关),您可以从 df2 中删除年份列:

    In [18]: del df2['year']
    
    In [19]: df1.merge(df2, how='left').merge(df3, how='left')
    Out[19]: 
       year   fruit  price  qty  weight  colour
    0  2010   apple    1.0  2.0      10     red
    1  2011   apple    3.0  4.0      10     red
    2  2010  banana    0.5  1.5      12  yellow
    3  2011  banana    7.0  8.0      12  yellow
    
    [4 rows x 6 columns]
    

    否则你可以做一个 groupby 和 ffill。

    【讨论】:

      【解决方案2】:

      起初所有的 JOIN 都可以在 SQL 中执行——这样会更快。

      如果你仍然想只在 python 中使用pandas.join:

      import pandas as pd
      df_1_2_joined = pd.join(df1,df2, on='fruit', how='inner')
      joined = pd.join(df_1_2_joined,df3, on='fruit', how='inner')
      

      joined = df1.join(df2, on='fruit').join(df3, on='fruit')
      

      参数这里是如何完全模拟 SQL-JOIN 类型 INNER|OUTER|LEFT|RIGHT

      【讨论】:

      • 嗯,我无法让您的第一个(或第二个)建议生效。连接的语法不是df.join(..)吗?
      猜你喜欢
      • 2016-11-17
      • 2020-05-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      相关资源
      最近更新 更多