如何对熊猫中两个不同大小的数据集的列求和

时间:2019-09-03 18:08:21

标签: python pandas data-analysis

我有两个数据集。第一个(df1)包含超过200.000行,第二个(df2)仅包含两行。我需要创建一个新列df1 ['column_2'],该列是df1 ['column_1']和df2 ['column_1']

的总和

当我尝试使df1 ['column_2'] = df1 ['column_1'] + df2 ['column_1']时出现错误“试图在DataFrame的切片副本上设置值。 尝试改用.loc [row_indexer,col_indexer] =值“

如何汇总具有不同行数的不同数据集的值? 感谢您的帮助! 我的笔记本的屏幕截图:https://prnt.sc/p1d6ze

3 个答案:

答案 0 :(得分:0)

我尝试了您的代码,并且使用 Pandas 0.25.0 ,该代码没有错误 Python 3.7.0 。 如果您使用旧版本,请考虑升级。

对于测试,我使用了10行(较短)的 df1

   column_1
0        10
1        20
2        30
3        40
4        50
5        60
6        70
7        80
8        90
9       100

df2 带有2行(与您的帖子一样):

   column_1
0         3
1         5

您的说明df1['column_2'] = df1['column_1'] + df2['column_1'] 给出以下结果:

   column_1  column_2
0        10      13.0
1        20      25.0
2        30       NaN
3        40       NaN
4        50       NaN
5        60       NaN
6        70       NaN
7        80       NaN
8        90       NaN
9       100       NaN

因此:

  • 将具有“重叠”索引值的元素相加。
  • 其他元素(在 df2 中没有相应的索引)是 NaN
  • 由于存在 NaN 值,因此该列被强制为 float

使用 .loc [...] 的该指令的替代形式是:

df1['column_2'] = df1.loc[:, 'column_1'] + df2.loc[:, 'column_1']

它也可以在我的计算机上工作。

或者您可能想“乘”(复制) df2 df1 的长度 总结之前?如果是,请运行:

df1['column_2'] = df1.column_1 + df2.column_1.values.tolist() * 5

在这种情况下, 5 df2 应该“相乘”的次数。

这次没有索引对齐,结果是:

   column_1  column_2
0        10        13
1        20        25
2        30        33
3        40        45
4        50        53
5        60        65
6        70        73
7        80        85
8        90        93
9       100       105

答案 1 :(得分:0)

Reindex应用于df,与其他记录相比,其记录数较少,例如,此处y

减法:

import pandas as pd
import re
x = pd.DataFrame([(100,200),(300,400),(100,111)], columns=['a','b'])
y = pd.DataFrame([(1,2),(3,4)], columns=['a','b'])
z= x - y.reindex_like(x).fillna(0)

添加

import pandas as pd
import re
x = pd.DataFrame([(100,200),(300,400),(100,111)], columns=['a','b'])
y = pd.DataFrame([(1,2),(3,4)], columns=['a','b'])
z= x + y.reindex_like(x).fillna(0)

乘法

import pandas as pd
import re
x = pd.DataFrame([(100,200),(300,400),(100,111)], columns=['a','b'])
y = pd.DataFrame([(1,2),(3,4)], columns=['a','b'])
z= x * y.reindex_like(x).fillna(1)

答案 2 :(得分:0)

我发现,如果df_1是来自原始数据帧df的切片,则无法使df_1 ['column_3] = df_1 ['column_1] + df_1 ['column_2]。因此,我通过编写一个函数解决了我的问题:

def new_column(dataframe):
    if dataframe['column']=='value_1':
   dataframe['new_column'] =(dataframe['column_1']
   - df_2[df_2['column']=='value_1']
      ['column_1'].values[0])
    else:
       dataframe['new_column'] =(dataframe['column_1']
       - df_2[df_2['column']=='value_2']
          ['column_1'].values[0])
    return dataframe
dataframe=df_1.apply(new_column,axis=1)