Pandas:通过对来自不同dfs的列进行求和来创建新df的Pythonic方法

时间:2018-01-29 11:39:31

标签: python pandas

假设我们有两个dfs

df1

SELECT CONVERT(char(3),Datename(Month,CAST([Date] AS VARCHAR(20))))

df2

  a b
z 3 4
x 1 3

我想创建df3,它有两个新行[b,n],它的值基于对我的两个dfs中的列[a,b]进行求和,如下所示:

df3

  a b 
c 4 8
v 6 1

我知道这可以通过在两个数据帧上使用.sum()并手动创建df3来完成,如下所示:

  a  b
b 4  7
n 10 9

我只是想知道是否有更多的pythonic方法,使用单个函数或迭代在更短的时间内生成它。

2 个答案:

答案 0 :(得分:3)

第一级concat使用sum

df3 = pd.concat([df1, df2], keys=['b', 'n']).sum(level=0)
print (df3)
    a  b
b   4  7
n  10  9

多个DataFrames的解决方案:

dfs = [df1, df2, df3, ...]
df = pd.concat(dfs, keys=range(len(dfs))).sum(level=0)

编辑:

如果只想总结一些列:

 cols = set(df1.columns).intersection(df2.columns)
df3 = pd.concat([df1[['a','b']], df2[['a','b']]], keys=['b', 'n']).sum(level=0)

对于两个DataFrame中的所有列:

cols = list(set(df1.columns).intersection(df2.columns))
df3 = pd.concat([df1[cols], df2[cols]], keys=['b', 'n']).sum(level=0)
print (df3)
    a  b
b   4  7
n  10  9

答案 1 :(得分:2)

您可以使用sumconcat执行此操作。

pd.concat([df1.sum(), df2.sum()], 1).T

    a  b
0   4  7
1  10  9

或者,使用keys参数 -

pd.concat([df1.sum(), df2.sum()], 1, keys=['b', 'n']).T
    a  b
b   4  7
n  10  9

如果您有许多这样的数据框,并假设它们具有相同的列,您可以将它们放入单个列表中并在列表理解中调用sum -

df_list = [df1, df2, ...]
pd.concat([df.sum() for df in df_list], 1, keys=['b', 'n']).T

    a  b
b   4  7
n  10  9