对于一列中的每个唯一值,Pandas在另一列中获得唯一值

时间:2018-02-25 23:30:52

标签: python pandas

我有一个数据框,其中每一行都包含与单个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')

3 个答案:

答案 0 :(得分:8)

以下是两种策略。毫无疑问,还有其他方法。

假设您的数据框看起来像这样某些(显然有更多列):

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分别在一个单独的列中,这可能更有用,取决于你想用它做什么,你可以在以下之后执行:

df2 = df2.apply(pd.Series)

结果:

>>> df2
          0    1
author          
a       sr1  sr2
b       sr2  NaN

解决方案2:迭代数据框

您可以为所有独特作者制作新的数据框:

df2 = pd.DataFrame({'author':df.author.unique()})

然后只需获取他们活跃的所有唯一子编辑列表,将其分配给新列:

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]

答案 1 :(得分:3)

使用sacul的样本数据

df['subreddit'].groupby(df['author']).unique().apply(pd.Series)
Out[370]: 
          0    1
author          
a       sr1  sr2
b       sr2  NaN

答案 2 :(得分:0)

使用groupby.agg()“ aggrgeate”函数:

*

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'])

enter image description here


df.groupby('colors', as_index=True).agg({'numbers' : {"unique" : lambda x: set(x),
                                                      "nunique" : lambda x : len(set(x))}})

enter image description here