如何使用pandas数据帧创建一个矩阵,它是多个矩阵的总和?

时间:2018-04-23 11:14:29

标签: python arrays pandas numpy matrix

我有多个数据框,我保存在如下所示的连接列表中。每个df代表一个矩阵。

my_df = pd.concat([df1, df2, df3, .....])

如何将所有这些dfs(矩阵)合并为一个df(矩阵)?

我找到了discussion here,但它只回答了如何添加两个数据框,使用如下代码。

df_x.add(df_y, fill_value=0)

我应该在循环中使用上面的代码,还是有更简洁的方法?

我试图做print(my_df.sum())但是得到了一个非常令人困惑的结果(它突然变成了一行而不是二维矩阵)。

谢谢。

3 个答案:

答案 0 :(得分:2)

如果DataFrame中的每个list具有相同的索引和列值,我认为需要functools.reduce

np.random.seed(2018)

df1 = pd.DataFrame(np.random.choice([1,np.nan,2], size=(3,3)), columns=list('abc'))
df2 = pd.DataFrame(np.random.choice([1,np.nan,3], size=(3,3)), columns=list('abc'))
df3 = pd.DataFrame(np.random.choice([1,np.nan,4], size=(3,3)), columns=list('abc'))
print (df1)
     a    b    c
0  2.0  2.0  2.0
1  NaN  NaN  1.0
2  1.0  2.0  NaN

print (df2)
     a    b    c
0  NaN  NaN  1.0
1  3.0  3.0  3.0
2  NaN  1.0  3.0

print (df3)
     a    b    c
0  4.0  NaN  NaN
1  4.0  1.0  1.0
2  4.0  NaN  1.0

from functools import reduce

my_df = [df1,df2, df3]

df = reduce(lambda x, y: x.add(y, fill_value=0), my_df)
print (df)
     a    b    c
0  6.0  2.0  3.0
1  7.0  4.0  5.0
2  5.0  3.0  4.0

答案 1 :(得分:2)

我认为对此的惯用解决方案是在keys参数的帮助下保留有关不同DataFrame的信息,然后在最内层使用sum:

dfs = [df1, df2, df3]
my_df = pd.concat(dfs, keys=['df{}'.format(i+1) for i in range(len(dfs))])
my_df.sum(level=1)

产生

     a    b    c
0  6.0  2.0  3.0
1  7.0  4.0  5.0
2  5.0  3.0  4.0

使用jezrael的示例DataFrames。

答案 2 :(得分:1)

一种方法是将sum与数组列表一起使用。这里的输出将是一个数组而不是数据帧。

这假设您需要将np.nan替换为0:

res = sum([x.fillna(0).values for x in [df1, df2, df3]])

或者,您可以通过几种不同的方式直接使用numpy

res_np1 = np.add.reduce([x.fillna(0).values for x in [df1, df2, df3]])

res_np2 = np.nansum([x.values for x in [df1, df2, df3]], axis=0)

numpy.nansum假定np.nan等于零,用于求和。