2017-02-17 124 views
3

我尝试添加不同长度的两只大熊猫dataframes在一起:结合两只大熊猫dataframes只需添加整数计数

fruit rating count 
0 apple  A  2 
1 pear  B  2 
2 peach  A  1 
3 apple  B  2 
4 pear  C  1 

    fruit rating count 
0 apple  A 0 
1 apple  B 0 
2 apple  C 0 
3 pear  A 0 
4 pear  B 0 
5 pear  C 0 
6 peach  A 0 
7 peach  B 0 
8 peach  C 0 

基本上我想第一dataframes'计数整数添加到它下面的第二个类型和评级是相同的。例如,由于“pear和B”,dataframe1上的索引1应该在dataframe2的索引4上添加2两个计数。

我已经尝试过更新功能,但它似乎与索引混乱,只是取代了类型和评级。如果我不擅长解释,请道歉。我仍在学习。非常感谢你的帮助。

回答

0

假设你dataframes是DF1分别DF2,

df3 = pd.merge(df2, df1, how = 'outer', on = ['fruit', 'rating']) 
df3 = df3.drop('count_x', axis = 1).fillna(0) 
df3.columns = ['fruit', 'rating', 'count'] 

会给你想要的数据帧

fruit rating count 
0 apple A 2.0 
1 apple B 2.0 
2 apple C 0.0 
3 pear A 0.0 
4 pear B 2.0 
5 pear C 1.0 
6 peach A 1.0 
7 peach B 0.0 
8 peach C 0.0 
+0

非常感谢! –

2

您可以在相关的索引尝试groupby

​​

这给你一个多重索引DataFrame

   count 
fruit rating  
apple A   2.0 
     B   2.0 
     C   0.0 
peach A   1.0 
     B   0.0 
     C   0.0 
pear A   0.0 
     B   2.0 
     C   1.0 

如果要删除索引只是重置索引:

result.reset_index() 
Out[182]: 
    fruit rating count 
0 apple  A 2.0 
1 apple  B 2.0 
2 apple  C 0.0 
3 peach  A 1.0 
4 peach  B 0.0 
5 peach  C 0.0 
6 pear  A 0.0 
7 pear  B 2.0 
8 pear  C 1.0 
+0

没有必要groupby。水果和评级似乎已经是独一无二的了。使用设置索引 – piRSquared

+0

谢谢。我仍然在学习自己。实际上,这帮助我实现了我认为'groupby'会为我做的事情。 –

+0

非常感谢! –

0

这侧重于更新只需要添加行和维护integerdtype

df1.append(df2).groupby(['fruit', 'rating']).sum().reset_index() 

    fruit rating count 
0 apple  A  2 
1 apple  B  2 
2 apple  C  0 
3 peach  A  1 
4 peach  B  0 
5 peach  C  0 
6 pear  A  0 
7 pear  B  2 
8 pear  C  1 
1

我发现SQL最直观的用于这样的目的:

import pandasql 
import pandas as pd 

pysqldf = lambda q: pandasql.sqldf(q, globals()) 

Table1 = pd.DataFrame() 
Table1['x'] = [x for x in range(10)] 
Table2 = pd.DataFrame() 
Table2['x'] = [x for x in range(10)] 

print pysqldf(''' 
SELECT 
    *, 
    1 as ID 
FROM Table1 
UNION 
    SELECT *,2 as ID 
    FROM Table2 
''')