Pandas groupby를 사용하여 여러 행의 문자열 연결


92

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를 사용하고 "텍스트"열에 문자열 연결을 적용하는 방법을 알지 못합니다. 어떤 도움을 주셔서 감사합니다!

답변:


159

'name''month'열을 그룹화 한 다음 transform원본 df에 정렬 된 데이터를 반환 join하고 텍스트 항목에 람다를 적용하는 호출 을 수행 할 수 있습니다 .

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_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

최신 정보

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

1
에서가 pandas < 1.0, .drop_duplicates()예기치 않은 결과를 줄 수있는 인덱스를 무시합니다. .agg(lambda x: ','.join(x))대신을 사용하여이를 피할 수 있습니다 .transform().drop_duplicates().
Matthias Fripp

깔끔하고 복잡하지 않습니다. 또한 뛰어난 유연성
Raghavan vmvs

drop_duplicates()매개 변수를 포함하지 않거나 drop_duplicates(inplace=True)코드 줄을 다음과 같이 다시 작성하면 작동하지 않을 수 있습니다.df = df[['name','text','month']].drop_duplicates()
IAmBotmaker

44

우리는 할 수 GROUPBY , '이름'과 '달'열을 다음) (팬더의 DataFrame이 객체의 기능을 AGG 호출합니다.

agg () 함수에서 제공하는 집계 기능을 사용하면 한 번의 계산으로 그룹당 여러 통계를 계산할 수 있습니다.

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

여기에 이미지 설명 입력


27

EdChum의 답변은 많은 유연성을 제공하지만 문자열을 목록 개체의 열로 연결하려는 경우 다음을 수행 할 수도 있습니다.

output_series = df.groupby(['name','month'])['text'].apply(list)


이봐, 당신은 저에게 많은 시간을 절약했습니다. 감사합니다. 이것은 등록 / 사용자 ID의 연대순 목록을 내가 아는 '코호트'로 조합하는 가장 좋은 방법입니다. 다시 한번 감사드립니다.
Alex Fedotov

5

나에게 위의 솔루션은 가깝지만 원치 않는 / n 및 dtype : object 추가되었으므로 수정 된 버전은 다음과 같습니다.

df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.