将值添加到数据帧的所有行

时间:2017-10-27 04:36:12

标签: python pandas dataframe addition

我有两个pandas数据框 df1 (长度为2)和 df2 (长度约为30行) )。 df1的索引值总是不同的,并且永远不会出现在df2中。我想将 df1 的列平均值添加到 df2 的相应列中。示例:将c1和0.9的所有行添加0.6到c2等的所有行...

df1: 
  Date       c1   c2   c3   c4    c5   c6 ...  c10
2017-09-10  0.5  0.6  1.2   0.7  1.3  1.8 ...  1.3
2017-09-11  0.7  1.2  1.3   0.4  0.7  0.4 ...  1.5


df2:
  Date       c1   c2   c3   c4    c5   c6 ...  c10
2017-09-12  0.9  0.1  1.4   0.9  1.5  1.9 ...  1.9
2017-09-13  0.2  1.8  1.2   1.4  2.7  0.8 ...  1.1
    :                                  :  
    :                                  :     
2017-10-10  1.5  0.9  1.5   0.9  1.6  1.8 ...  1.7
2017-10-11  2.7  1.1  1.9   0.4  0.8  0.8 ...  1.3

我该怎么做?

4 个答案:

答案 0 :(得分:4)

mean上使用df1时,默认会计算每列,并生成pd.Series

添加pd.Seriespd.DataFrame时,它会将pd.Series的索引与pd.DataFrame的列对齐,并沿着{{1}的索引进行广播}}... 默认情况下。

唯一棘手的问题是处理pd.DataFrame列。

选项1

Date

如果我知道m = df1.mean() df2.loc[:, m.index] += m df2 Date c1 c2 c3 c4 c5 c6 c10 0 2017-09-12 1.5 1.0 2.65 1.45 2.5 3.0 3.3 1 2017-09-13 0.8 2.7 2.45 1.95 3.7 1.9 2.5 2 2017-10-10 2.1 1.8 2.75 1.45 2.6 2.9 3.1 3 2017-10-11 3.3 2.0 3.15 0.95 1.8 1.9 2.7 总是在第一列,我可以:

'Date'

选项2
请注意,我在df2.iloc[:, 1:] += df1.mean() df2 Date c1 c2 c3 c4 c5 c6 c10 0 2017-09-12 1.5 1.0 2.65 1.45 2.5 3.0 3.3 1 2017-09-13 0.8 2.7 2.45 1.95 3.7 1.9 2.5 2 2017-10-10 2.1 1.8 2.75 1.45 2.6 2.9 3.1 3 2017-10-11 3.3 2.0 3.15 0.95 1.8 1.9 2.7 中使用append=True参数,只是因为索引中有些东西你不想搞砸。

set_index

如果您不关心索引,可以将其缩短为

df2.set_index('Date', append=True).add(df1.mean()).reset_index('Date')

         Date   c1   c2    c3    c4   c5   c6  c10
0  2017-09-12  1.5  1.0  2.65  1.45  2.5  3.0  3.3
1  2017-09-13  0.8  2.7  2.45  1.95  3.7  1.9  2.5
2  2017-10-10  2.1  1.8  2.75  1.45  2.6  2.9  3.1
3  2017-10-11  3.3  2.0  3.15  0.95  1.8  1.9  2.7

答案 1 :(得分:1)

如果所有列都在两个数据框中,那么只需

for col in df2.columns:
    df2[col] = df2[col] + df1[col].mean()

如果列不一定在两者中:

for col in df2.columns:
    if col in df1.columns:
        df2[col] = df2[col] + df1[col].mean()

答案 2 :(得分:1)

可能有一种更有效的方法,但这是一个快速而肮脏的解决方案。我希望这有帮助!

d = {'c1': [0.5,0.7], 'c2': [0.6,1.2],'c3': [1.2,1.3]}
df1 = pd.DataFrame(data=d, index=['2017-09-10','2017-09-11'])
df2 = pd.DataFrame(data=d, index=['2017-09-12','2017-09-13'])

DF1

      Date   c1 c2  c3
2017-09-10  0.5 0.6 1.2
2017-09-11  0.7 1.2 1.3

DF2

Date   c1   c2  c3
2017-09-12  0.5 0.6 1.2
2017-09-13  0.7 1.2 1.3

df1中每列的平均值可以使用describe()函数

获得
df1.describe().ix['mean']

c1    0.60
c2    0.90
c3    1.25

现在,只需将系列添加到df2

即可
df2 + df1.describe().ix['mean']

Date     c1 c2  c3
2017-09-12  1.1 1.5 2.45
2017-09-13  1.3 2.1 2.55

答案 3 :(得分:0)

这可能是另一种方式,只是简化了一点

import pandas as pd
import numpy as np
from datetime import datetime, timedelta 
date_today=datetime.now()

#Creating df1 & df2 
df1=pd.DataFrame(
    {
        'Date':[date_today,date_today],
        'c1':[0.5,0.4],
        'c2':[0.6,0.3]
    }
)
df2=pd.DataFrame(
    {
        'Date':[date_today,date_today,date_today],
        'c1':[0.9,0.7,0.6],
        'c2':[0.8,0.4,0.3]
    }
)


#getting average of column c1
avg=df1["c1"].mean()

#Adding the average to your existing column of df2
df2['c1']+avg