Pandas:通过对不同df的列求和来创建新df的Pythonic方法
假设我们有两个dfs df1 及 df2 我想创建df3,它有两个新行[b,n],它的值基于两个dfs中[a,b]列的总和,如下所示: df3 我知道,只需在两个数据帧上使用.sum并手动创建df3即可实现,如下所示:Pandas:通过对不同df的列求和来创建新df的Pythonic方法,python,pandas,Python,Pandas,假设我们有两个dfs df1 及 df2 我想创建df3,它有两个新行[b,n],它的值基于两个dfs中[a,b]列的总和,如下所示: df3 我知道,只需在两个数据帧上使用.sum并手动创建df3即可实现,如下所示: df3 = pd.DataFrame([[4,7],[10,9]], columns = ['a','b']) 我只是想知道是否有一种更具python风格的方法,即使用单个函数或迭代在更短的时间内生成它。使用with by first level: df3 = pd.conca
df3 = pd.DataFrame([[4,7],[10,9]], columns = ['a','b'])
我只是想知道是否有一种更具python风格的方法,即使用单个函数或迭代在更短的时间内生成它。使用with by first level:
df3 = pd.concat([df1, df2], keys=['b', 'n']).sum(level=0)
print (df3)
a b
b 4 7
n 10 9
多数据帧解决方案:
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
编辑:
如果只想对某些列求和:
cols = set(df1.columns).intersection(df2.columns)
df3 = pd.concat([df1[['a','b']], df2[['a','b']]], keys=['b', 'n']).sum(level=0)
对于两个数据帧中的所有列:
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
按第一级使用:
df3 = pd.concat([df1, df2], keys=['b', 'n']).sum(level=0)
print (df3)
a b
b 4 7
n 10 9
多数据帧解决方案:
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
编辑:
如果只想对某些列求和:
cols = set(df1.columns).intersection(df2.columns)
df3 = pd.concat([df1[['a','b']], df2[['a','b']]], keys=['b', 'n']).sum(level=0)
对于两个数据帧中的所有列:
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
你可以用sum和concat来实现
或者,使用关键参数-
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
你可以用sum和concat来实现
或者,使用关键参数-
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
首先,感谢您提供了这一行伟大的代码。我们非常接近,但不在那里!df3.ab基本上是df1的和。a/df3bb是df1.b的和,df3.an是df2.a/df3.bn的和,df2.b的和,所以当我这样做时:df3=pd.concat[[df1.a.sum,df1.b.sum],[df2.a.sum,df2.b.sum]],1,key=['b','n'].T I get:TypeError:无法连接非NDFrame对象我还想指出,我在每个df中的行数超过两行,并且在df1和df2中的行数不相同。再次感谢您花了这么多时间!首先,感谢您提供了这一行伟大的代码。我们非常接近,但不在那里!df3.ab基本上是df1的和。a/df3bb是df1.b的和,df3.an是df2.a/df3.bn的和,df2.b的和,所以当我这样做时:df3=pd.concat[[df1.a.sum,df1.b.sum],[df2.a.sum,df2.b.sum]],1,key=['b','n'].T I get:TypeError:无法连接非NDFrame对象我还想指出,我在每个df中的行数超过两行,并且在df1和df2中的行数不相同。再次感谢您花了这么多时间!我编辑答案,我想你想要pd.concat[df1[['a','b']],df2['a','b']],keys=['b','n'].sumlevel=0。我编辑答案,我想你想要pd.concat[df1['a','b']],df2['a','b']],keys=['b','n'].sumlevel=0。先生,你刚刚赢了一块饼干。非常感谢。先生,你刚刚赢了一块饼干。非常感谢。