簡體   English   中英

Pandas,對於一列中的每個唯一值,在另一列中獲取唯一值

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

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