我有两个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
我该怎么做?
答案 0 :(得分:4)
在mean
上使用df1
时,默认会计算每列,并生成pd.Series
。
添加pd.Series
到pd.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