将两个pandas数据框组合在一起,只需将整数计数相加。

3

我正在尝试将不同长度的两个pandas数据框相加:

    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

基本上,我想将第一个数据框的计数整数添加到下面与类型和评级相同的第二个数据框中。例如,数据帧1上的索引1应将2添加到数据帧2上索引4的计数中,因为是“pear and B”。
我尝试过使用update函数,但它似乎会干扰索引并只替换类型和评级。如果我解释得不好,请原谅,因为我还在学习。非常感谢您的帮助。
4个回答

2
您可以在相关索引上尝试使用groupby
temp1=first_df.set_index(['fruit','rating'])
temp2=second_df.set_index(['fruit','rating'])
result = temp1.add(temp2,fill_value=0)

这将为您提供一个多级索引的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

不需要使用groupby。水果和评分似乎已经是唯一的了。请使用set index。 - piRSquared
谢谢。我自己还在学习中。实际上,这帮助我很多,让我达到了我认为“groupby”会为我做的事情。 - Sebastian Wozny

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
''')

0
假设您的数据框分别为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

这个重点是更新只需要添加的行并保留 integer dtype

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接