簡體   English   中英

如何根據選定的列使用 pandas DataFrame 將行聚合在一起

[英]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.

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