![](/img/trans.png)
[英]Python Pandas - filter pandas dataframe to get rows with minimum values in one column for each unique value in another column
[英]Pandas, for each unique value in one column, get unique values in another column
我有一個數據框,其中每一行都包含與單個 Reddit 評論(例如作者、subreddit、評論文本)有關的各種元數據。
我想執行以下操作:對於每個作者,我想獲取他們有評論的所有 subreddits 的列表,並將這些數據轉換為一個 Pandas 數據框,其中每一行對應一個作者,以及所有唯一 subreddits 的列表他們評論。
我目前正在嘗試以下的一些組合,但無法解決:
嘗試 1:
group = df['subreddit'].groupby(df['author']).unique()
list(group)
嘗試 2:
from collections import defaultdict
subreddit_dict = defaultdict(list)
for index, row in df.iterrows():
author = row['author']
subreddit = row['subreddit']
subreddit_dict[author].append(subreddit)
for key, value in subreddit_dict.items():
subreddit_dict[key] = set(value)
subreddit_df = pd.DataFrame.from_dict(subreddit_dict,
orient = 'index')
這里有兩種策略可以做到這一點。 毫無疑問,還有其他方法。
假設你的數據框看起來是這樣的(很明顯,更多的列):
df = pd.DataFrame({'author':['a', 'a', 'b'], 'subreddit':['sr1', 'sr2', 'sr2']})
>>> df
author subreddit
0 a sr1
1 a sr2
2 b sr2
...
解決方案1:groupby
比解決方案 2 更直接,類似於您的第一次嘗試:
group = df.groupby('author')
df2 = group.apply(lambda x: x['subreddit'].unique())
# Alternatively, same thing as a one liner:
# df2 = df.groupby('author').apply(lambda x: x['subreddit'].unique())
結果:
>>> df2
author
a [sr1, sr2]
b [sr2]
作者是索引,單列是他們活躍的所有 subreddits的列表(根據你的描述,這是我解釋你想要的輸出方式的方式)。
如果您希望將 subreddits 分別放在一個單獨的列中,這可能更有用,具體取決於您想用它做什么,您可以在之后執行以下操作:
df2 = df2.apply(pd.Series)
結果:
>>> df2
0 1
author
a sr1 sr2
b sr2 NaN
解決方案 2:遍歷數據幀
您可以使用所有獨特的作者創建一個新的數據框:
df2 = pd.DataFrame({'author':df.author.unique()})
然后只需獲取他們處於活動狀態的所有唯一 subreddits 的列表,將其分配給一個新列:
df2['subreddits'] = [list(set(df['subreddit'].loc[df['author'] == x['author']]))
for _, x in df2.iterrows()]
這給你這個:
>>> df2
author subreddits
0 a [sr2, sr1]
1 b [sr2]
通過使用 sacul 的樣本數據
df['subreddit'].groupby(df['author']).unique().apply(pd.Series)
Out[370]:
0 1
author
a sr1 sr2
b sr2 NaN
使用 groupby.agg() “聚合”函數:
*
DataFrameGroupBy.agg(arg, *args, **kwargs):在指定軸上使用一個或多個操作聚合。 用於聚合數據的函數。 如果是函數,則必須在傳遞 DataFrame 或傳遞給 DataFrame.apply 時工作
df = pd.DataFrame({'numbers': [1, 2, 3, 6, 9], 'colors': ['red', 'white', 'blue', 'red', 'white']}, columns=['numbers', 'colors'])
df.groupby('colors', as_index=True).agg({'numbers' : {"unique" : lambda x: set(x),
"nunique" : lambda x : len(set(x))}})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.