[英]How do I aggregate rows in a pandas dataframe according to the latest dates in a column?
[英]How can I aggregate rows together according to a selected column using a pandas DataFrame
這是我在 Stack Overflow 中的第一個問題。 我會淡化我目前遇到的問題。 我正在嘗試為基於用戶的協同過濾推薦系統清理數據集。
這是我對所有用例的數據集的過度簡化
data = pd.DataFrame({'name': ['John' ,'Jane' ,'Joe' ,'John' ,'Jane' , 'Joe'],
'movie1': ['' , 'bad' , 'avg' , 'nice', '' , '' ],
'movie2': ['good' , '' , '' , '' , 'poor', '' ],
'movie3': ['bad' , '' , 'good', '' , '' , '' ],
})
從我獲取數據的方式來看,我知道即使 John、Jane 和 Joe 可能會重復自己多次,但他們對任何給定電影的評分永遠不會超過一個。
我希望能夠將重復的用戶聚合到一行中,以便終端中的 output 如下所示:
name movie1 movie2 movie3
0 John nice good bad
1 Jane bad poor
2 Joe avg good
這個問題與這個問題非常相似,但不同之處在於我處理的是字符串對象而不是數字,因此我不能使用聚合函數How can I"merge" rows by same value in a column in Pandas with aggregation functions ?
我的真實數據集有 4260 列和 24169 行,因此我無法應用類似df.groupby(['name','month'])['text'].apply(','.join).reset_index()
因為不可能寫下所有的列名。 來自: 使用 Pandas groupby 連接來自多行的字符串
我嘗試按照這個問題的答案進行操作,但要么出現錯誤,要么我的 dataframe 保持不變。 Pandas | 合並具有相同 ID 的行
盡管從邏輯上講它沒有意義,但我嘗試使用data.groupby('name').ffill().drop_duplicates('name',keep='last')
我得到了以下錯誤 = KeyError: Index([ '名稱'], dtype='對象')
將 False 傳遞給 groupby 內的 as_index 給了我完全相同的錯誤data.groupby('name', as_index=False).ffill().reset_index().drop_duplicates('name', keep='last')
我得到的最接近的是: data = data.groupby('name', as_index=False).apply(lambda x: x.fillna(method='ffill').iloc[0])
它給我的 output 只刪除重復的行,但不會將評級添加到剩余數據中:
name movie1 movie2 movie3
0 Jane bad
1 Joe avg good
2 John good bad
完整代碼:
import pandas as pd
data = pd.DataFrame({'name': ['John' ,'Jane' ,'Joe' ,'John' ,'Jane' , 'Joe'],
'movie1': ['' , 'bad' , 'avg' , 'nice', '' , '' ],
'movie2': ['good' , '' , '' , '' , 'poor', '' ],
'movie3': ['bad' , '' , 'good', '' , '' , '' ],
})
print('Baseline:')
print(data.head())
#data = data.join(data['name'])
#data.groupby('name').ffill().drop_duplicates('name' ,keep='last')
#data.groupby('name', as_index=False).ffill().reset_index().drop_duplicates('name', keep='last')
data = data.groupby('name', as_index=False).apply(lambda x: x.fillna(method='ffill').iloc[0])
#data.groupby('name').ffill().drop_duplicates('name', keep='last')
#data = data.groupby(['name'])[['movie1','movie2','movie3']].apply('.'.join).reset_index()
print('End result:')
print(data.head())
IIUC,您可以使用groupby_first
。 訣竅是用 nan 替換空字符串,然后在選擇第一個有效值后回滾:
>>> data.replace('', np.nan).groupby('name', as_index=False, sort=False).first().fillna('')
name movie1 movie2 movie3
0 John nice good bad
1 Jane bad poor
2 Joe avg good
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.