我需要在資料框列中顯示 user_id 和 content_id 的長度,這是一個串列物件。但是很難使用 groupby。請幫助 groupby 以及我在這篇文章底部提出的問題(如何在資料框中獲得結果以及 user_id?)
資料框型別:
df.dtypes
輸出:
user_id object
content_id object
dtype: object
樣本資料:
user_id content_id
0 user_18085 [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19...
1 user_16044 [cont_2738_2_49, cont_4482_2_19, cont_4994_18_...
2 user_13110 [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19...
3 user_18909 [cont_3170_2_28]
4 user_15509 [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19...
熊貓查詢:
df.groupby('user_id')['content_id'].count().reset_index()
df.groupby(['user_id'])['content_id'].apply(lambda x: get_count(x))
輸出:
user_id content_id
0 user_10013 1
1 user_10034 1
2 user_10042 1
當我嘗試不分組時,我會變得很好,如下所示 -
df['content_id'].apply(lambda x: len(x))
0 11
1 9
2 11
3 1
但是,如何在資料框中獲得結果以及 user_id?就像我想要的以下格式 -
user_id content_id
some xxx 11
some yyy 6
uj5u.com熱心網友回復:
pandas.Groupby回傳一個 grouper 元素,而不是每個單元格的內容。因此,不可能(沒有很多變通方法)做你想做的事。相反,您需要簡單地重寫列(如@ifly6 所建議)
使用
df_agg = df.copy()
df_agg.content_id = df_agg.content_id.apply(len)
df_agg = df_agg.groupby('user_id').sum()
Groupby將產生與您描述的相同的資料框。
為了完整起見,單個 groupby 的指令將是
df.groupby('user_id').agg(lambda x: x.apply(len).sum())
uj5u.com熱心網友回復:
嘗試將 content_id 轉換為字串,用逗號分割,然后重新組合為串列串列,然后計算串列項。
data="""index user_id content_id
0 user_18085 [cont_2598_4_4,cont_2738_2_49,cont_4482_2_19]
1 user_16044 [cont_2738_2_49,cont_4482_2_19,cont_4994_18_]
2 user_13110 [cont_2598_4_4,cont_2738_2_49,cont_4482_2_19]
3 user_18909 [cont_3170_2_28]
4 user_15509 [cont_2598_4_4,cont_2738_2_49,cont_4482_2_19]
"""
df = pd.read_csv(StringIO(data), sep='\s ')
def convert_to_list(x):
x=re.sub(r'[\[\]]', '', x)
lst=list(x.split(','))
return lst
df['content_id2']= [list() for x in range(len(df.index))]
for key,item in df.iterrows():
lst=convert_to_list(str(item['content_id']))
for item in lst:
df.loc[key,'content_id2'].append(item)
def count_items(x):
return len(x)
df['count'] = df['content_id2'].apply(count_items)
df.drop(['content_id'],axis=1,inplace=True)
df.rename(columns={'content_id2':'content_id'},inplace=True)
print(df)
輸出:
index user_id content_id count
0 0 user_18085 [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19] 3
1 1 user_16044 [cont_2738_2_49, cont_4482_2_19, cont_4994_18_] 3
2 2 user_13110 [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19] 3
3 3 user_18909 [cont_3170_2_28] 1
4 4 user_15509 [cont_2598_4_4, cont_2738_2_49, cont_4482_2_19] 3
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/453883.html
標籤:Python 熊猫 熊猫-groupby
