Python 3.x 使用Pandas groupby连接多行中的字符串

Python 3.x 使用Pandas groupby连接多行中的字符串,python-3.x,pandas,pandas-groupby,Python 3.x,Pandas,Pandas Groupby,我想基于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","

我想基于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”列中应用某种字符串串联。感谢您的帮助

您可以按
'name'
'month'
列分组,然后调用
transform
,它将返回与原始df对齐的数据,并应用lambda,其中我们将
连接
文本条目:

In [119]:

df['text'] = df[['name','text','month']].groupby(['name','month'])['text'].transform(lambda x: ','.join(x))
df[['name','text','month']].drop_duplicates()
Out[119]:
    name         text  month
0  name1       hej,du     11
2  name1        aj,oj     12
4  name2     fin,katt     11
6  name2  mycket,lite     12
我通过在此处传递感兴趣的列列表
df[['name'、'text'、'month']]
来细分原始df,然后调用
drop\u duplicates

编辑实际上我可以调用
应用
,然后
重置索引

In [124]:

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

Out[124]:
    name  month         text
0  name1     11       hej,du
1  name1     12        aj,oj
2  name2     11     fin,katt
3  name2     12  mycket,lite
更新

此处不需要
lambda

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

Out[38]: 
    name  month         text
0  name1     11           du
1  name1     12        aj,oj
2  name2     11     fin,katt
3  name2     12  mycket,lite

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


output\u series=df.groupby(['name','month'])['text'].apply(list)

对我来说,上述解决方案很接近,但添加了一些不需要的/n和dtype:object,因此这里是一个修改版本:

df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()

我们可以groupby对“name”和“month”列进行分组,然后调用Panda的数据帧对象的agg()函数。

agg()函数提供的聚合功能允许在一次计算中为每组计算多个统计信息

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


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

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

虽然这是一个老问题。但以防万一。我使用了下面的代码,它看起来像一个符咒

text = ''.join(df[df['date'].dt.month==8]['text'])

pandas<1.0
中,
.drop\u duplicates()
忽略索引,这可能会产生意外的结果。您可以通过使用
.agg(lambda x:','.join(x))
而不是
.transform().drop_duplicates()
。整洁且简单来避免这种情况。如果您不包含参数
drop\u duplicates(inplace=True)
或者只是将代码行重写为
df=df[['name','text','month']],那么也可能无法使用
drop\u duplicates()
伙计,您刚刚为我节省了很多时间。非常感谢。这是将按时间顺序排列的注册/用户ID列表组合成我所知道的“队列”的最佳方法。再次感谢你。