python - 按日期排序 Pandas ,自定义聚合器 : combine all the data for each date

标签 python pandas dataframe jupyter-notebook

我正试图找到一个解决方案,如何更改我的 pandas 数据框。 我有一个带有新闻标题的数据集。每天有多个头条新闻。我想将日期(天)作为行,每个标题每天都分配给一个新列。 换句话说,我想合并每个日期的所有标题数据。而不是每天都有一个单独的标题。 某种 pandas 自定义聚合器可以完成这项工作,但我正在努力想出一个。

我能够按日期对数据进行分组,但现在每天的所有标题都在同一列中。而不是在单独的列中。 (见图2)

df_nyt_all.groupby(['date'], as_index = False).agg({'headline': ','.join})

我一直在寻找解决方案,但一直没有成功。

我附上了 3 张图片。第一张图片显示了我的 df 最初的样子。 current df

current df

第三张图片显示了我希望 df 看起来像的示例。

how the df should look like

最佳答案

以小数据框为例:

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/

相关文章:

android - 从 SL4A 脚本启动 android 应用程序?

python - MySQL连接器无法正常工作并给出错误

python - plotly 指标数字舍入

python - 比较其他 Pandas 数据框每一行的值(value)

python - 插入空白行 Pandas 数据框

r - 按元素的总和/平均值过滤行

python - 让 Pandas NaT 像 NaN 一样传播

python - 如何从 pandas 的列中删除列表中的字符串

python - 使用参数列表删除行 Pandas

python - 将一列列表拆分为不同的列时出错