在 Pandas 中汇总具有相同索引的两个以上数据帧
Summing up more than two dataframes with the same indexes in Pandas
我想在 Pandas 中添加具有相同索引的 4 个数据帧的值。如果有两个dataframes,df1和df2,我们可以这样写:
df1.add(df2)
对于 3 个数据帧:
df3.add(df2.add(df1))
我想知道 Python 中是否有更通用的方法来做到这一点。
选项 1
使用 sum
sum([df1, df2, df3, df4])
选项 2
使用 reduce
from functools import reduce
reduce(pd.DataFrame.add, [df1, df2, df3, df4])
选项 3
将 pd.concat
和 pd.DataFrame.sum
与 level=1
一起使用
这仅在数据帧索引只有一个级别时才有效。我们必须变得更可爱才能让它发挥作用。我推荐其他选项。
pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
设置
df = pd.DataFrame([[1, -1], [complex(0, 1), complex(0, -1)]])
df1, df2, df3, df4 = [df] * 4
演示
sum([df1, df2, df3, df4])
0 1
0 (4+0j) (-4+0j)
1 4j -4j
from functools import reduce
reduce(pd.DataFrame.add, [df1, df2, df3, df4])
0 1
0 (4+0j) (-4+0j)
1 4j -4j
pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
0 1
0 (4+0j) (-4+0j)
1 4j -4j
计时
小数据
%timeit sum([df1, df2, df3, df4])
%timeit reduce(pd.DataFrame.add, [df1, df2, df3, df4])
%timeit pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
1000 loops, best of 3: 591 µs per loop
1000 loops, best of 3: 456 µs per loop
100 loops, best of 3: 3.61 ms per loop
更大的数据
df = pd.DataFrame([[1, -1], [complex(0, 1), complex(0, -1)]])
df = pd.concat([df] * 1000, ignore_index=True)
df = pd.concat([df] * 100, axis=1, ignore_index=True)
df1, df2, df3, df4 = [df] * 4
%timeit sum([df1, df2, df3, df4])
%timeit reduce(pd.DataFrame.add, [df1, df2, df3, df4])
%timeit pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
100 loops, best of 3: 3.94 ms per loop
100 loops, best of 3: 2.9 ms per loop
1 loop, best of 3: 1min per loop
我想在 Pandas 中添加具有相同索引的 4 个数据帧的值。如果有两个dataframes,df1和df2,我们可以这样写:
df1.add(df2)
对于 3 个数据帧:
df3.add(df2.add(df1))
我想知道 Python 中是否有更通用的方法来做到这一点。
选项 1
使用 sum
sum([df1, df2, df3, df4])
选项 2
使用 reduce
from functools import reduce
reduce(pd.DataFrame.add, [df1, df2, df3, df4])
选项 3
将 pd.concat
和 pd.DataFrame.sum
与 level=1
一起使用
这仅在数据帧索引只有一个级别时才有效。我们必须变得更可爱才能让它发挥作用。我推荐其他选项。
pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
设置
df = pd.DataFrame([[1, -1], [complex(0, 1), complex(0, -1)]])
df1, df2, df3, df4 = [df] * 4
演示
sum([df1, df2, df3, df4])
0 1
0 (4+0j) (-4+0j)
1 4j -4j
from functools import reduce
reduce(pd.DataFrame.add, [df1, df2, df3, df4])
0 1
0 (4+0j) (-4+0j)
1 4j -4j
pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
0 1
0 (4+0j) (-4+0j)
1 4j -4j
计时
小数据
%timeit sum([df1, df2, df3, df4])
%timeit reduce(pd.DataFrame.add, [df1, df2, df3, df4])
%timeit pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
1000 loops, best of 3: 591 µs per loop
1000 loops, best of 3: 456 µs per loop
100 loops, best of 3: 3.61 ms per loop
更大的数据
df = pd.DataFrame([[1, -1], [complex(0, 1), complex(0, -1)]])
df = pd.concat([df] * 1000, ignore_index=True)
df = pd.concat([df] * 100, axis=1, ignore_index=True)
df1, df2, df3, df4 = [df] * 4
%timeit sum([df1, df2, df3, df4])
%timeit reduce(pd.DataFrame.add, [df1, df2, df3, df4])
%timeit pd.concat(dict(enumerate([df1, df2, df3, df4]))).sum(level=1)
100 loops, best of 3: 3.94 ms per loop
100 loops, best of 3: 2.9 ms per loop
1 loop, best of 3: 1min per loop