[英]Count unique values for each group in multi column with criteria in Pandas
更新了樣本數據集
我有以下數據:
location ID Value
A 1 1
A 1 1
A 1 1
A 1 1
A 1 2
A 1 2
A 1 2
A 1 2
A 1 3
A 1 4
A 2 1
A 2 2
A 3 1
A 3 2
B 4 1
B 4 2
B 5 1
B 5 1
B 5 2
B 5 2
B 6 1
B 6 1
B 6 1
B 6 1
B 6 1
B 6 2
B 6 2
B 6 2
B 7 1
我想為以下輸出的每個位置和每個 ID 計算唯一值(僅當值等於 1 或 2 時)。
location ID_Count Value_Count
A 3 6
B 4 7
我嘗試使用df.groupby(['location'])['ID','value'].nunique()
,但我只得到值的唯一計數,就像我得到 A 的 value_count 為 4 和 for B 為 2。
嘗試在True
值的ID
上使用切片進行agg
。
對於更新后的樣本,您只需要在處理前刪除重復項。 其余都是一樣的
df = df.drop_duplicates(['location', 'ID', 'Value'])
df_agg = (df.Value.isin([1,2]).groupby(df.location)
.agg(ID_count=lambda x: df.loc[x[x].index, 'ID'].nunique(),
Value_count='sum'))
Out[93]:
ID_count Value_count
location
A 3 6
B 4 7
IIUC,您可以嘗試series.isin
與groupby.agg
out = (df.assign(Value_Count=df['Value'].isin([1,2])).groupby("location",as_index=False)
.agg({"ID":'nunique',"Value_Count":'sum'}))
print(out)
location ID Value_Count
0 A 3 6.0
1 B 4 7.0
與 anky 大致相同,但隨后使用Series.where
和named aggregations
因此我們可以在 groupby 中創建列時重命名列。
grp = df.assign(Value=df['Value'].where(df['Value'].isin([1, 2]))).groupby('location')
grp.agg(
ID_count=('ID', 'nunique'),
Value_count=('Value', 'count')
).reset_index()
location ID_count Value_count
0 A 3 6
1 B 4 7
讓我們嘗試一種與其他答案非常相似的方法。 這次我們先過濾:
(df[df['Value'].isin([1,2])]
.groupby(['location'],as_index=False)
.agg({'ID':'nunique', 'Value':'size'})
)
輸出:
location ID Value
0 A 3 6
1 B 4 7
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.