假设我有三个具有相同索引和相同列名的数据框(有些列是字符串,另一些是数字):df1,df2,df3。
df1
Hour | X1 | X2 | X3 | X4
0 | 10 | H | 2 | -1
1 | 10 | b | 1 | 0
2 | 10 | D | 1 | 0
3 | 20 | L | 1 | 0
df2
Hour | X1 | X2 | X3 | X4
0 | 10 | H | 1 | 1
1 | 10 | b | 1 | 0
2 | 10 | D | 1 | 0
3 | 20 | L | 2 | 0
df3
Hour | X1 | X2 | X3 | X4
0 | 10 | H | 0 | 0
1 | 10 | b | 0 | 0
2 | 10 | D | 0 | 0
3 | 20 | L | 0 | 30
我想要一个新的数据框,该数值是这些数据框的平均值,但要保持字符串列不变(所有字符串列都相同)。
df4 =
Hour | X1 | X2 | X3 | X4
0 | 10 | H | 1 | 0
1 | 10 | b | 1 | 0
2 | 10 | D | 1 | 0
3 | 20 | L | 1 | 10
我更喜欢使用add函数,因为我必须编写一个for循环来访问每个数据帧。谢谢!
答案 0 :(得分:3)
先做concat
然后做agg
pd.concat([df1,df2,df3]).groupby(level=0).agg(lambda x : x.mean() if x.dtype=='int64' else x.head(1))
答案 1 :(得分:1)
您可以使用select_dtypes
来分隔数字和非数字序列。然后将pd.concat
与groupby
+ mean
一起使用。最后,加入固定系列和重新索引列。
fixed = df1.select_dtypes(include=['object'])
numcols = df1.columns.difference(fixed.columns)
res = pd.concat([df1, df2, df3]).reindex(columns=numcols)\
.groupby(level=0).mean()\
.join(fixed).reindex(columns=df1.columns)
print(res)
Hour X1 X2 X3 X4
0 0.0 10.0 H 1.000000 0.0
1 1.0 10.0 b 0.666667 0.0
2 2.0 10.0 D 0.666667 0.0
3 3.0 20.0 L 1.000000 10.0