复杂的pandas合并操作

时间:2013-12-17 13:42:32

标签: python join merge pandas

我仍然很新加入/合并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与df1具有相同的果实,但不是相同的年份(我几乎完全确定df2​​的年份是df1的子集,虽然找到一个方法会很好,但是在df2中可以使用多年不包括在df1)中。 Df3是一个表格,其中包含df2和df1中包含的所有水果的字符。我想将三个表合并在一起,因此新组合DataFrame中的每一行都有年份,水果,价格,数量,重量(可能是NaN)和颜色。我不确定这样的数据结构是否最好包含在Panel或DataFrame中 - 对此的输入也非常受欢迎。谢谢!

2 个答案:

答案 0 :(得分:2)

为了确保这些年没有问题,我首先会设置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。

答案 1 :(得分:0)

首先,可以在SQL中执行所有JOIN - 它会更快。

如果你仍然只想在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')

OR

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

参数如何完全类似于SQL-JOINs类型INNER | OUTER | LEFT | RIGHT