簡體   English   中英

每兩列的總和,並在 pandas dataframe 中留下一列

[英]Sum of every two columns and leave one column 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

我想做的是 output dataframe 看起來像這樣:

Out
        s1 b s2  d  s3  f
    0   3  2  7  4  11  6
    1   3  2  7  4  11  6
    2   3  2  7  4  11  6

也就是說,分別對(a,b),(c,d),(e,f)列求和,並保留最后一列並將結果列名稱重命名為(s1,s2,s3)。 任何人都可以幫助解決 Pandas 中的這個問題嗎? 太感謝了。

一做

df['a'] = df['a'] + df['b']
df.rename(columns={col1: 's1')}, inplace=True)

您可以使用循環來完成所有操作

  • 使用enumeratezip的循環,生成

    (0,('a','b')), (1,('c','d')), (2,('e','f'))
  • 使用這些索引進行求和和重命名

import pandas as pd
cols = ['a','b','c','d','e','f']
df =pd.DataFrame([(1,2,3,4,5,6),(1,2,3,4,5,6),(1,2,3,4,5,6)],columns=cols)
    
for idx, (col1, col2) in enumerate(zip(cols[::2], cols[1::2])):
    df[col1] = df[col1] + df[col2]
    df.rename(columns={col1: 's'+str(idx+1)}, inplace=True)

print(df)

CODE DEMO

你可以試試這個: -

res = pd.DataFrame()
for i in range(len(df.columns)-1):
    if i%2==0:
        res[df.columns[i]] = df[df.columns[i]]+df[df.columns[i+1]]
    else:
        res[df.columns[i]] = df[df.columns[i]]

res['f'] = df[df.columns[-1]]
res.columns = ['s1', 'b', 's2', 'd', 's3', 'f']

Output:-

   s1  b  s2  d  s3  f
0   3  2   7  4  11  6
1   3  2   7  4  11  6
2   3  2   7  4  11  6

您可以通過iloc按位置查看列,對每個2值求和,最后通過f-string重命名列

i = 2
for x in range(0, len(df.columns), i):
    df.iloc[:, x] = df.iloc[:, x:x+i].sum(axis=1)
    df = df.rename(columns={df.columns[x]:f's{x // i + 1}'})
print (df)
   s1  b  s2  d  s3  f
0   3  2   7  4  11  6
1   3  2   7  4  11  6
2   3  2   7  4  11  6
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'])
df['s1'] = df['a'] + df['b']
df['s2'] = df['c'] + df['d']
df['s3'] = df['e'] + df['f']

df =  a  b  c  d  e  f  s1  s2  s3
   0  1  2  3  4  5  6   3   7  11
   1  1  2  3  4  5  6   3   7  11
   2  1  2  3  4  5  6   3   7  11

你可以刪除列'a','b','c'

df.pop('a')
df.pop('c')
df.pop('d')
df =  b  e  f  s1  s2  s3
   0  2  5  6   3   7  11
   1  2  5  6   3   7  11
   2  2  5  6   3   7  11

跳躍分兩步; 所以我們可以用 np.split 拆分dataframe

res = np.split(df.to_numpy(), df.shape[-1] // 2, 1)

接下來,我們計算新數據,我們將列對相加並保留每對中的最后一列:

new_frame = np.hstack([np.vstack((np.sum(entry,1), entry[:,-1])).T for entry in res])

創建新列,考慮到 2 的跳轉:

new_cols = [f"s{ind//2+1}" if ind%2==0 else val for ind,val in enumerate(df.columns)]

新建 dataframe:

pd.DataFrame(new_frame, columns=new_cols)

    s1  b   s2  d   s3  f
0   3   2   7   4   11  6
1   3   2   7   4   11  6
2   3   2   7   4   11  6

暫無
暫無

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

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