Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas:通过对不同df的列求和来创建新df的Pythonic方法_Python_Pandas - Fatal编程技术网

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

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

假设我们有两个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.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。先生,你刚刚赢了一块饼干。非常感谢。先生,你刚刚赢了一块饼干。非常感谢。