gpt4 book ai didi

python - Pandas 数据框中每两列的总和

转载 作者:太空狗 更新时间:2023-10-30 02:02:33 25 4
gpt4 key购买 nike

当我使用 Pandas 时,我遇到了一个问题。我的任务是这样的:

df=pd.DataFrame([(1,2,3,4,5,6),(1,2,3,4,5,6),(1,2,3,4,5,6)],columns=['a','b','c','d','e','f'])
Out:
a b c d e f
0 1 2 3 4 5 6
1 1 2 3 4 5 6
2 1 2 3 4 5 6

我想要做的是输出数据框如下所示:

Out:
s1 s2 s3
0 3 7 11
1 3 7 11
2 3 7 11

即分别对(a,b),(c,d),(e,f)列求和,将结果列名重命名为(s1,s2,s3)。谁能帮助解决 Pandas 中的这个问题?非常感谢。

最佳答案

1) 通过提供 axis=1 执行 groupby w.r.t 列。根据@Boud 的评论,您只需对分组数组进行一些小的调整就可以得到您想要的:

df.groupby((np.arange(len(df.columns)) // 2) + 1, axis=1).sum().add_prefix('s')

enter image description here

根据以下条件进行分组:

np.arange(len(df.columns)) // 2
# array([0, 0, 1, 1, 2, 2], dtype=int32)

2) 使用 np.add.reduceat这是一个更快的选择:

df = pd.DataFrame(np.add.reduceat(df.values, np.arange(len(df.columns))[::2], axis=1))
df.columns = df.columns + 1
df.add_prefix('s')

enter image description here

时序约束:

对于 100 万行跨越 20 列的 DF:

from string import ascii_lowercase
np.random.seed(42)
df = pd.DataFrame(np.random.randint(0, 10, (10**6,20)), columns=list(ascii_lowercase[:20]))
df.shape
(1000000, 20)

def with_groupby(df):
return df.groupby((np.arange(len(df.columns)) // 2) + 1, axis=1).sum().add_prefix('s')

def with_reduceat(df):
df = pd.DataFrame(np.add.reduceat(df.values, np.arange(len(df.columns))[::2], axis=1))
df.columns = df.columns + 1
return df.add_prefix('s')

# test whether they give the same o/p
with_groupby(df).equals(with_groupby(df))
True

%timeit with_groupby(df.copy())
1 loop, best of 3: 1.11 s per loop

%timeit with_reduceat(df.copy()) # <--- (>3X faster)
1 loop, best of 3: 345 ms per loop

关于python - Pandas 数据框中每两列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40660956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com