我有以下資料框:
import pandas as pd
score = [2,5,1,7,8,3,8,9,10,1]
group = ["A", "A", "B", "C", "C", "B", "A", "D", "D", "C"]
df = pd.DataFrame([group, score]).T
df.columns = ['Group', 'Score']
這使:
Group Score
0 A 2
1 A 5
2 B 1
3 C 7
4 C 8
5 B 3
6 A 8
7 D 9
8 D 10
9 C 1
我想構建一個新列,為給定組提供上一個條目。它還會洗掉沒有先前條目的行。所以我的預期輸出是這樣的:
score = [5,8,3,8,10,1]
previous_score = [2, 7, 1, 5, 9, 8]
group = ["A", "C", "B", "A", "D", "C"]
df1 = pd.DataFrame([group, score, previous_score]).T
df1.columns = ['Group', 'Score', 'Previous Score']
這使:
Group Score Previous Score
0 A 5 2
1 C 8 7
2 B 3 1
3 A 8 5
4 D 10 9
5 C 1 8
我可以根據組將資料框分解為單獨的資料框并使用shift,然后將它們重新組合在一起。但是,這些資料的順序很重要。我也可以遍歷資料框并找到上一個條目,但這效率低下。同樣,我認為這將涉及一些groupby作業,但我無法弄清楚如何在沒有回圈的情況下做到這一點。
uj5u.com熱心網友回復:
您可以使用groupby.shift獲取每個組的每行中的上一行的分數。然后dropna洗掉 NaN:
df = df.assign(Previous_Score=df.groupby('Group')['Score'].shift()).dropna().reset_index(drop=True)
輸出:
Group Score Previous_Score
0 A 5 2
1 C 8 7
2 B 3 1
3 A 8 5
4 D 10 9
5 C 1 8
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468418.html
標籤:Python 熊猫 数据框 熊猫-groupby
