[英]Group by a column and count string in another column in Python Pandas dataframe
[英]Python Pandas Group Dataframe by Column / Sum Integer Column by String Column
我整日都被困住了,讀了很多SO文章,但仍然停留在我最后的最后一篇文章中。 我將CSV導入了一個龐大的數據框,然后最終得到了下面的較小數據框:(注意:我的df現在在“名稱”上建立了索引,這是我需要根據組或求和的基礎)
Name Classification Value 1 Value 2
Company 1 Classification Code 1 5000 8000
Company 1 Classification Code 1 6000 2000
Company 2 Classification Code 1 2000 3000
Company 2 Classification Code 1 1000 4500
Company 3 Classification Code 2 15000 10000
Company 3 Classification Code 2 20000 32000
Company 4 Classification Code 3 7500 10000
Company 4 Classification Code 3 7000 1500
我現在正在努力的是如何基於公司對兩個值求和(我主要使用groupby和sum(),但是已經停滯了幾個小時。我知道有很多關於在熊貓中對事物求和的SO文章。但我已經好幾個小時沒有運氣了,我們將不勝感激,非常感謝。
編輯:我正在尋找的輸出如下
Company 1 Classification Code 1 11,000 10,000
Company 2 Classification Code 1 3,000 7,500
Company 3 Classification Code 2 35,000 42,000
Company 4 Classification Code 3 14,500 11,500
選項1
set_index
然后groupby
這假定'Classification'
列是相同的跨Company
df.set_index('Classification', append=True) \
.groupby(level=[0, 1]).sum().reset_index(1)
Classification Value 1 Value 2
Name
Company 1 Classification Code 1 11000 10000
Company 2 Classification Code 1 3000 7500
Company 3 Classification Code 2 35000 42000
Company 4 Classification Code 3 14500 11500
選項2
groupby
然后agg
這不會對'Company'
中'Classification'
唯一性做出任何假設,而只會獲取每個'Company'
的第一個'Classification'
'Company'
df.groupby(level=0).agg(
{'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})
Classification Value 1 Value 2
Name
Company 1 Classification Code 1 11000 10000
Company 2 Classification Code 1 3000 7500
Company 3 Classification Code 2 35000 42000
Company 4 Classification Code 3 14500 11500
對評論的回應
關於串聯
檢查dtypes
與df.dtypes
。 如果看到object
而不是int
則是,您需要轉換為numeric
。
您可以簡單地通過
df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
{'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})
或更手動
df['Value 1'] = df['Value 1'].astype(int)
df['Value 2'] = df['Value 2'].astype(int)
然后繼續進行先前的建議。
關於列的放置
您可以隨時對列進行重新排序
d1 = df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
{'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})
d1[df.columns]
要么
d1 = df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
{'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})
d1.reindex_axis(df.columns, 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.