问答中心分类: PYTHON使用Pandas groupby连接多行中的字符串
0
匿名用户 提问 3月 前

我想基于Pandas中的groupedby在数据帧中合并几个字符串。
这是我目前的代码:

import pandas as pd
from io import StringIO

data = StringIO("""
"name1","hej","2014-11-01"
"name1","du","2014-11-02"
"name1","aj","2014-12-01"
"name1","oj","2014-12-02"
"name2","fin","2014-11-01"
"name2","katt","2014-11-02"
"name2","mycket","2014-12-01"
"name2","lite","2014-12-01"
""")

# load string as stream into dataframe
df = pd.read_csv(data,header=0, names=["name","text","date"],parse_dates=[2])

# add column with month
df["month"] = df["date"].apply(lambda x: x.month)

我希望最终结果如下所示:
在此处输入图像描述
我不知道如何使用groupby并在“text”列中应用某种串接。感谢您的帮助!

6 Answers
0
Ram Prajapati 回答 3月 前

我们可以子句“name”和“month”列,然后打电话agg()熊猫数据框对象的功能。
由提供的聚合功能agg()函数允许在一次计算中计算每组的多个统计信息。

df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})

在此处输入图像描述

kağan hazal koçdemir 回复 3月 前

您好,有没有关于使用agg函数删除重复项的想法?

Nicolas78 回复 3月 前

@kağanhazalkoçdemiragg({'text': lambda x: ' '.join(set(x))})

0
Rutger Hofste 回答 3月 前

EdChum的答案为您提供了很大的灵活性,但如果您只想将字符串连接到列表对象列中,您还可以:

output_series = df.groupby(['name','month'])['text'].apply(list)
Alex Fedotov 回复 3月 前

伙计,你帮我节省了很多时间。非常感谢。这是将按时间顺序排列的注册/用户ID列表组合成我所知的“队列”的最佳方式。再次感谢您。

whydoesntwork 回复 3月 前

这个解决方案对我来说也非常有效,可以获得独特的外观。我只使用了“set”而不是“list”,然后daisy链接了join和presto。请注意,如果存在nan值,则不起作用,因此我必须首先在文本字段上使用fillna()。在我的例子中,命令结束了:df。groupby([‘doc\u id’])[‘author’]。应用(设置)。应用(“,”。join)。重置索引()

Bill 回复 3月 前

我不认为这会在字符串之间添加空格,是吗?

0
Ismail 回答 3月 前

如果要在列表中连接“文本”:

df.groupby(['name', 'month'], as_index = False).agg({'text': list})
0
Nic Scozzaro 回答 3月 前

对我来说,上述解决方案很接近,但添加了一些不必要的内容/n'sdtype:object,这是一个修改版本:

df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
0
Ashish Anand 回答 3月 前

请尝试这行代码:-

df.groupby(['name','month'])['text'].apply(','.join).reset_index()