数据帧的平均值

时间:2019-01-05 02:47:59

标签: python pandas dataframe

假设我有三个具有相同索引和相同列名的数据框(有些列是字符串,另一些是数字):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循环来访问每个数据帧。谢谢!

2 个答案:

答案 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.concatgroupby + 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