簡體   English   中英

熊貓 - 組和計數nunique值

[英]pandas - group and count nunique values

我有這種數據幀df:

User,C,G
111,ar,1
112,es,1
112,es,1
112,es,2
113,es,2
113,es,3
113,es,3
114,es,4

我希望返回的輸出是:

G,nU,ar,es
1,2,1,1
2,2,0,2
3,1,0,1
4,1,0,1

基本上,對於每個G ,我計算nU列中其中的不同User的數量以及C字符串的出現次數。 每個用戶都有一個唯一的C值。 例如,在G編號1中我有兩個用戶(111和112),其中一個出現在'ar'中,一個出現在'es'中(無論是否有兩個112次出現,我只需要(112,'es) ')單身夫婦)。 總結'ar'和'es'列應該返回nU列。 到目前為止我試過這個:

d = df.reset_index().groupby('G')['User'].nunique()

它正確返回用戶數但沒有關於C列的信息。

很抱歉這可能造成混亂。

鑒於df

result = df.groupby(['G', 'User'])['C'].value_counts()

產量

G  User    
1  111   ar    1
   112   es    2
2  112   es    1
   113   es    1
3  113   es    2
4  114   es    1
dtype: int64

這計算ares每次出現。 我們真的只想計算唯一出現次數,所以讓我們將Series中的每個值設置為1:

result[:] = 1

所以result看起來像

G  User    
1  111   ar    1
   112   es    1
2  112   es    1
   113   es    1
3  113   es    1
4  114   es    1
dtype: int64

現在,如果我們按照第一個和最后一個索引級別( G值和C值)進行分組,並對每個組求和,

result = result.groupby(level=['G',-1]).sum()

我們得到

G    
1  ar    1
   es    1
2  es    2
3  es    1
4  es    1
dtype: int64

現在我們可以取消堆疊最后一個索引級別:

result = result.unstack()

獲得

   ar  es
G        
1   1   1
2 NaN   2
3 NaN   1
4 NaN   1

用零填充NaN:

result = result.fillna(0)

定義nU列和行的總和:

result['nU'] = result.sum(axis=1)

並重新排序列:

result = result[['nU', 'ar', 'es']]

把它們放在一起:

import pandas as pd
df = pd.read_csv('data')
result = df.groupby(['G', 'User'])['C'].value_counts()
result[:] = 1
result = result.groupby(level=['G',-1]).sum()
result = result.unstack()
result = result.fillna(0)
result['nU'] = result.sum(axis=1)
result = result[['nU', 'ar', 'es']]

產量

   nU  ar  es
G            
1   2   1   1
2   2   0   2
3   1   0   1
4   1   0   1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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