python - 复杂的 pandas 合并操作

标签 python join merge pandas

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

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

df2<br/> Out[15]:<br/> ---- fruit weight<br/> 2010 apple 10<br/> 2010 banana 12

df3<br/> Out[16]:<br/> -- fruit colour<br/> 0 apple red<br/> 1 banana yellow

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

最佳答案

为了确保年份没有问题,我会先重置_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。

关于python - 复杂的 pandas 合并操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635781/

相关文章:

python - Python 中的统一成本搜索

MySQL - 基于比较插入或更新

ruby-on-rails - Rails Join - 如何获取同名字段

mysql - Hibernate - 连接查询

git - 在这些场景下使用 git cherry-pick 是否合适?

python - 如果存在BooleanField,则NgramField无法正常工作……Haystack + Elasticsearch的问题

python - 如何在 TensorFlow 中选择交叉熵损失?

Git表示分支已 merge ,但显然不存在更改

Python如何区分python套接字模块中的数据(当服务器接收时。)

list - Prolog统一和优化