假设我们有两个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方法,使用单个函数或迭代在更短的时间内生成它。
答案 0 :(得分:3)
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)
您可以使用sum
和concat
执行此操作。
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