首页 > 解决方案 > 在具有相同 ID 的单个元素或行中拆分列表 os 字符串和整数

问题描述

我想要有一个元素列表的行,起初我有一个具有这种结构的 DataFrame:

╔═══════════════════════════════════╦════════════╦══════════╦═════════════╗
║ url                               ║ date       ║ name     ║ numMentions ║
║ www.newspaperarticle              ║ 2018-12-31 ║ Bill     ║ 2           ║
║ www.newspaperarticle              ║ 2018-12-31 ║ Cosby    ║ 3           ║
║ www.newspaperarticle              ║ 2018-12-31 ║ New York ║ 1           ║
║ 
╚═══════════════════════════════════╩════════════╩══════════╩═════════════╝

我将其更改为一个结构,其中名称中的单词和 numMentions 中的数字通过分组附加到 IDS url/name 一次:

 df.groupby(['url','date'], as_index=False).agg({
    'name': lambda x: list(x),
    'numMentions': lambda x: list((map(str,x))),
    'avgSalience':lambda x: list((map(str,x)))
})

我得到了以下数据框:

╔══════════════════════╦════════════╦═══════════════════════╦═════════════╗
║ url                  ║ date       ║ name                  ║ numMentions ║
║ www.newspaperarticle ║ 2018-12-31 ║ [Bill,Cosby,NewYork]  ║ [2,3,1]     ║
╚══════════════════════╩════════════╩═══════════════════════╩═════════════╝

我想要的是能够访问列表中的单个单词,因为当前列表只是一个包含所有单词的元素或如下结构:

╔═══════════════════════════════════╦════════════╦══════════╦═════════════╗
║ url                               ║ date       ║ name     ║ numMentions ║
║ www.newspaperarticle              ║ 2018-12-31 ║ Bill     ║ 2           ║
║                                                ║ Cosby    ║ 3           ║
║                                                ║ New York ║ 1           ║
║ 
╚═══════════════════════════════════╩════════════╩══════════╩═════════════╝

这是一个有 10 行的数据示例

标签: pythonpandasdataframe

解决方案


在你的 groupby 之后,你可以使用 Pandas Series 字符串函数 "join",它的工作原理与 python str "join" 一样。

df.name.str.join(' ')

和:

df.numMentions.str.join(' ')

这将为您提供值,您只需将其重新分配给相关系列即可。

编辑

这对我有用:

import pandas as pd
data = {
    'url': ['www.newspaperarticle', 'www.newspaperarticle', 'www.newspaperarticle'],
    'date': ['2018-12-31', '2018-12-31', '2018-12-31'],
    'name': ['Bill', 'Cosby', 'New York'],
    'numMentions': [2, 3, 1]
}
df = pd.DataFrame(data)
grouped = df.groupby(['url','date'], as_index=False).agg({
    'name': lambda x: list(x),
    'numMentions': lambda x: list((map(str, x)))
})
names = grouped.name.str.join(' ')
numMentions = grouped.numMentions.str.join(' ')
new = grouped.assign(name=names, numMentions=numMentions)
print(new)

这产生:

    url                     date        name                numMentions
0   www.newspaperarticle    2018-12-31  Bill Cosby New York   2 3 1

推荐阅读