我有一个数据框,其中每一行都包含与单个Reddit注释有关的各种元数据(例如作者,subreddit,注释文本)。
我要执行以下操作:对于每个作者,我都希望获取他们有注释的所有子注释的列表,并将此数据转换为熊猫数据框,其中每一行都对应于一个作者,以及所有唯一子注释的列表他们发表评论。
我目前正在尝试以下各项的组合,但无法解决:
尝试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]
作者是索引,单列是它们活动所在的所有子索引的列表(根据您的描述,这就是我解释您希望输出的方式)。
如果您希望每个子redredit在单独的列中,可能更有用,具体取决于您要执行的操作,您可以在执行以下操作之后:
df2 = df2.apply(pd.Series)
结果:
>>> df2
0 1
author
a sr1 sr2
b sr2 NaN
解决方案2:遍历数据框
您可以使用所有唯一作者创建一个新的数据框:
df2 = pd.DataFrame({'author':df.author.unique()})
然后只需获取它们处于活动状态的所有唯一子reddit的列表,然后将其分配给新列即可:
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]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句