我有多个数据框,我保存在如下所示的连接列表中。每个df代表一个矩阵。
my_df = pd.concat([df1, df2, df3, .....])
如何将所有这些dfs(矩阵)合并为一个df(矩阵)?
我找到了discussion here,但它只回答了如何添加两个数据框,使用如下代码。
df_x.add(df_y, fill_value=0)
我应该在循环中使用上面的代码,还是有更简洁的方法?
我试图做print(my_df.sum())
但是得到了一个非常令人困惑的结果(它突然变成了一行而不是二维矩阵)。
谢谢。
答案 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
等于零,用于求和。