我正试图找到一个解决方案,如何更改我的 pandas 数据框。 我有一个带有新闻标题的数据集。每天有多个头条新闻。我想将日期(天)作为行,每个标题每天都分配给一个新列。 换句话说,我想合并每个日期的所有标题数据。而不是每天都有一个单独的标题。 某种 pandas 自定义聚合器可以完成这项工作,但我正在努力想出一个。
我能够按日期对数据进行分组,但现在每天的所有标题都在同一列中。而不是在单独的列中。 (见图2)
df_nyt_all.groupby(['date'], as_index = False).agg({'headline': ','.join})
我一直在寻找解决方案,但一直没有成功。
我附上了 3 张图片。第一张图片显示了我的 df 最初的样子。
第三张图片显示了我希望 df 看起来像的示例。
最佳答案
以小数据框为例:
df = pd.DataFrame({'Date':['d1','d1','d1','d2','d2'],'headline':['h1','h2','h3','h4','h5']})
我们可以这样完善您自己的答案:
df.groupby(['Date'], as_index = True).agg({'headline': ','.join})['headline'].str.split(',', expand=True)
它将您用逗号加入的标题拆分为单独的列:
0 1 2
Date
d1 h1 h2 h3
d2 h4 h5 None
这不是很稳健,因为如果标题有逗号,它也会在这些逗号上分开。一个更强大的解决方案是它的一个变体,我们首先通过将每个日期的标题收集到一个列表中来聚合,然后扩展列表:
df.groupby('Date', as_index=True)['headline'].apply(list).apply(pd.Series).reset_index()
(这里我重置索引——你可以在第一个解决方案中做同样的事情)得到
Date 0 1 2
0 d1 h1 h2 h3
1 d2 h4 h5 NaN
要获取列名,解决方案可以展开如下。我们创建一个字典,用 f'Top{n}' 替换 'n' for n 从 0 到最大列索引
df2 = df.groupby('Date', as_index=True)['headline'].apply(list).apply(pd.Series).reset_index()
new_col_names = {n:f'Top{n}' for n in range(len(df2.columns))}
df2.rename(columns = new_col_names, inplace = True)
df2
产生
Date Top0 Top1 Top2
0 d1 h1 h2 h3
1 d2 h4 h5 NaN
关于python - 按日期排序 Pandas ,自定义聚合器 : combine all the data for each date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64776596/