簡體   English   中英

在 Pandas dataframe Python 中用 groupby 減去值

[英]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_diffdropna刪除 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.

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