mat*_*mar 32 python-3.x pandas
我想基于Pandas中的分组来合并数据帧中的几个字符串.
到目前为止这是我的代码:
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)
Run Code Online (Sandbox Code Playgroud)
我希望最终结果如下所示:

我不知道如何使用groupby并在"text"列中应用某种字符串串联.任何帮助赞赏!
小智 72
我们可以GROUPBY的“名”和“月”列,然后调用AGG()熊猫的数据框对象的功能。
agg() 函数提供的聚合功能允许在一次计算中为每个组计算多个统计信息。
df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})
EdC*_*ica 62
您可以对'name'和'month'列进行分组,然后调用transform哪个将返回与原始df对齐的数据,并join在文本条目处应用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
Run Code Online (Sandbox Code Playgroud)
我通过传递一个感兴趣的列列表来分解原始df df[['name','text','month']],然后调用drop_duplicates
编辑实际上我可以打电话apply然后reset_index:
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
Run Code Online (Sandbox Code Playgroud)
更新
该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
Run Code Online (Sandbox Code Playgroud)
Rut*_*ste 10
EdChum的答案为您提供了很大的灵活性,但是如果您只想将字符串连接到列表对象的列中,则还可以:
output_series = df.groupby(['name','month'])['text'].apply(list)
小智 10
如果要在列表中连接“文本”:
df.groupby(['name', 'month'], as_index = False).agg({'text': list})
Run Code Online (Sandbox Code Playgroud)
对我来说,上述解决方案很接近,但添加了一些不需要的 /n 和 dtype:object,所以这是一个修改版本:
df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
Run Code Online (Sandbox Code Playgroud)
请尝试这行代码:-
df.groupby(['name','month'])['text'].apply(','.join).reset_index()
Run Code Online (Sandbox Code Playgroud)