簡體   English   中英

Pandas數據幀中每兩列的總和

[英]Sum of Every Two Columns in Pandas dataframe

當我使用熊貓時,我遇到了問題。 我的任務是這樣的:

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)。 任何人都可以幫助解決熊貓中的這個問題嗎? 非常感謝。

1)通過提供axis=1執行groupby wrt列。 根據Per @ Boud的評論,你可以通過分組數組中的小調整得到你想要的結果:

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

在此輸入圖像描述

根據這種情況進行分組:

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')

在此輸入圖像描述

時間限制:

對於橫跨20列的100萬行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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM