[英]Python pandas - groupby() skips repeated values in Dataframe
[英]Subtract values with groupby in Pandas dataframe Python
我有一個 dataframe 喜歡這個:
聯盟名稱 | 公司名 | 蟾蜍 | 工商管理碩士 | Class | 前夕 | 待定 | 蘇爾 |
---|---|---|---|---|---|---|---|
新華集團 | HVC公司 | 8845 | 1135 | 0 | 12 | 12128 | 1個 |
新華集團 | LDN公司 | 11 | 1243 | 133 | 121 | 113 | 1個 |
電報組 | 自由名稱有限責任公司 | 5487 | 223 | 928 | 0 | 0 | 21 |
電報組 | 總重量 | 0 | 7543 | 24 | 3213 | 15 | 21 |
零組 | 寵物動物園crp | 5574 | 0 | 2個 | 0 | 6478 | 1個 |
零組 | 大象 | 48324 | 0 | 32 | 118 | 4個 | 1個 |
如果列中的單元格具有相同的 Alliance_name,我需要減去它們之間的值。 (如果不減去最后一列Sur就完美了,但它不是主要目標)
我知道為了增加我們可以做這樣的事情:
df = df.groupby('Alliance_name').sum()
但我不知道如何用減法來做到這一點。
結果應該是這樣的(如果我們不減去最后一列):
聯盟名稱 | 公司名 | 蟾蜍 | 工商管理碩士 | Class | 前夕 | 待定 | 蘇爾 |
---|---|---|---|---|---|---|---|
新華集團 | HVC 公司 LDN 公司 | 8834 | -108 | -133 | -109 | 12015 | 1個 |
電報組 | 自由名 LLC Grt | 5487 | -7320 | 904 | -3212 | -15 | 21 |
零組 | PetZoo crp 大象 | -42750 | 0 | -30 | -118 | 6474 | 1個 |
謝謝你的幫助!
您可以反轉要減去的值,然后將它們相加。
df.loc[df.Alliance_name.duplicated(keep="first"), ["TOAD", "MBA", "Class", "EVE", "TBD", "Sur"]] *= -1
df.groupby("Alliance_name").sum()
IIUC,你只想從右下角減去頂部? 然后您可以使用groupby_diff
和dropna
刪除 NaN 值(因為第一行將是 NaN)。 然后將結果與“Company_name”和“Alliance_name”連接起來。
請注意,由於diff
找到頂部和底部之間的差異,因此我們需要減號。
out = pd.concat([df.groupby('Alliance_name')['Company_name'].first().reset_index(),
-df.drop(columns=['Company_name']).groupby('Alliance_name')
.diff()
.dropna()
.reset_index(drop=True)
], axis=1)
Output:
Alliance_name Company_name TOAD MBA Class EVE TBD Sur
0 Shinva group HVC corp 8834.0 -108.0 -133.0 -109.0 12015.0 -0.0
1 Telegraph group Freename LLC 5487.0 -7320.0 904.0 -3213.0 -15.0 -0.0
2 Zero group PetZoo crp -42750.0 -0.0 -30.0 -118.0 6474.0 -0.0
.first( .first()
和.last()
groupby 方法可用於此類任務。
您可以組織要跳過/計算的列
>>> df.columns
Index(['Alliance_name', 'Company_name', 'TOAD', 'MBA', 'Class', 'EVE', 'TBD',
'Sur'],
dtype='object')
>>> alliance, company, *cols, sur = df.columns
>>> groups = df.groupby(alliance)
>>> company = groups.first()[[company]]
>>> sur = groups.first()[sur]
>>> groups = groups[cols]
並直接使用.first() -.last()
:
>>> groups.first() - groups.last()
TOAD MBA Class EVE TBD
Alliance_name
Shinva group 8834 -108 -133 -109 12015
Telegraph group 5487 -7320 904 -3213 -15
Zero group -42750 0 -30 -118 6474
然后.join()
其他列返回
>>> company.join(groups.first() - groups.last()).join(sur).reset_index()
Alliance_name Company_name TOAD MBA Class EVE TBD Sur
0 Shinva group HVC corp 8834 -108 -133 -109 12015 1
1 Telegraph group Freename LLC 5487 -7320 904 -3213 -15 21
2 Zero group PetZoo crp -42750 0 -30 -118 6474 1
另一種方法:
>>> df - df.drop(columns=['Company_name', 'Sur']) .groupby('Alliance_name').shift(-1)
Alliance_name Class Company_name EVE MBA Sur TBD TOAD
0 NaN -133.0 NaN -109.0 -108.0 NaN 12015.0 8834.0
1 NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN 904.0 NaN -3213.0 -7320.0 NaN -15.0 5487.0
3 NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN -30.0 NaN -118.0 0.0 NaN 6474.0 -42750.0
5 NaN NaN NaN NaN NaN NaN NaN NaN
然后,您可以刪除所有 nan 行並填充原始 df 的剩余值。
>>> ((df - df.drop(columns=['Company_name', 'Sur'])
.groupby('Alliance_name').shift(-1)).dropna(how='all')[df.columns].fillna(df))
Alliance_name Company_name TOAD MBA Class EVE TBD Sur
0 Shinva group HVC corp 8834 -108 -133 -109 12015 1
2 Telegraph group Freename LLC 5487 -7320 904 -3213 -15 21
4 Zero group PetZoo crp -42750 0 -30 -118 6474 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.