我仍然很新加入/合并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中 - 对此的输入也非常受欢迎。谢谢!
答案 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