판다 그룹:줄 조합을 얻는 방법
다음과 같은 데이터 프레임이 있습니다.
A B C
0 1 0.749065 This
1 2 0.301084 is
2 3 0.463468 a
3 4 0.643961 random
4 1 0.866521 string
5 2 0.120737 !
부르기
In [10]: print df.groupby("A")["B"].sum()
돌아올 것입니다
A
1 1.615586
2 0.421821
3 0.463468
4 0.643961
이제 열 "C"에 대해 "동일"을 수행하고자 합니다.열에 문자열이 포함되어 있기 때문에 sum()이 작동하지 않습니다( 문자열을 연결할 수 있다고 생각할 수도 있지만).제가 정말 보고 싶은 것은 각 그룹에 대한 문자열의 목록 또는 집합입니다.
A
1 {This, string}
2 {is, !}
3 {a}
4 {random}
저는 이것을 할 방법을 찾으려고 노력해왔습니다.
Series.unique() (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.unique.html) 이 작동하지 않지만,
df.groupby("A")["B"]
가
pandas.core.groupby.SeriesGroupBy object
그래서 어떤 시리즈 방법이든 효과가 있기를 바랐습니다.무슨 생각 있어요?
In [4]: df = read_csv(StringIO(data),sep='\s+')
In [5]: df
Out[5]:
A B C
0 1 0.749065 This
1 2 0.301084 is
2 3 0.463468 a
3 4 0.643961 random
4 1 0.866521 string
5 2 0.120737 !
In [6]: df.dtypes
Out[6]:
A int64
B float64
C object
dtype: object
자체 함수를 적용할 때 숫자가 아닌 열에 대한 자동 제외는 없습니다.하지만 이것은 응용 프로그램보다 느립니다..sum()에게groupby
In [8]: df.groupby('A').apply(lambda x: x.sum())
Out[8]:
A B C
A
1 2 1.615586 Thisstring
2 4 0.421821 is!
3 3 0.463468 a
4 4 0.643961 random
sum기본적으로 연결되어 있습니다.
In [9]: df.groupby('A')['C'].apply(lambda x: x.sum())
Out[9]:
A
1 Thisstring
2 is!
3 a
4 random
dtype: object
당신은 당신이 원하는 것을 거의 다 할 수 있습니다.
In [11]: df.groupby('A')['C'].apply(lambda x: "{%s}" % ', '.join(x))
Out[11]:
A
1 {This, string}
2 {is, !}
3 {a}
4 {random}
dtype: object
한 번에 한 그룹씩 전체 프레임에 이런 작업을 하는 것입니다.핵심은 A를 반환하는 것입니다.Series
def f(x):
return Series(dict(A = x['A'].sum(),
B = x['B'].sum(),
C = "{%s}" % ', '.join(x['C'])))
In [14]: df.groupby('A').apply(f)
Out[14]:
A B C
A
1 2 1.615586 {This, string}
2 4 0.421821 {is, !}
3 3 0.463468 {a}
4 4 0.643961 {random}
사용할 수 있습니다.apply그룹화된 데이터에 임의 함수를 적용하는 방법.그래서 세트를 원하시면 신청해주세요.set. 목록을 원하시면 신청하세요.list.
>>> d
A B
0 1 This
1 2 is
2 3 a
3 4 random
4 1 string
5 2 !
>>> d.groupby('A')['B'].apply(list)
A
1 [This, string]
2 [is, !]
3 [a]
4 [random]
dtype: object
다른 걸 원하신다면, 원하는 대로 하고 그 다음에 하는 함수를 쓰시면 됩니다.apply그거.
사용할 수 있습니다.aggregate(또는agg) 값을 연결하는 함수입니다.(테스트되지 않은 코드)
df.groupby('A')['B'].agg(lambda col: ''.join(col))
이것을 시도해 볼 수 있습니다.
df.groupby('A').agg({'B':'sum','C':'-'.join})
명명된 집계:pandas >= 0.25.0
Pandas 버전 0.25.0 이후로 우리는 집합체의 이름을 붙였고, 집합체를 기준으로 그룹화하고 동시에 새로운 이름을 열에 할당할 수 있었습니다.이렇게 하면 MultiIndex 열을 얻을 수 없고 열 이름은 포함된 데이터를 고려할 때 더 합리적입니다.
문자열 목록을 집계하여 가져옵니다.
grp = df.groupby('A').agg(B_sum=('B','sum'),
C=('C', list)).reset_index()
print(grp)
A B_sum C
0 1 1.615586 [This, string]
1 2 0.421821 [is, !]
2 3 0.463468 [a]
3 4 0.643961 [random]
집합하여 줄을 잇다
grp = df.groupby('A').agg(B_sum=('B','sum'),
C=('C', ', '.join)).reset_index()
print(grp)
A B_sum C
0 1 1.615586 This, string
1 2 0.421821 is, !
2 3 0.463468 a
3 4 0.643961 random
간단한 해결책은 다음과 같습니다.
>>> df.groupby(['A','B']).c.unique().reset_index()
데이터 프레임의 열 B를 덮어쓰려면 다음과 같이 해야 합니다.
df = df.groupby('A',as_index=False).agg(lambda x:'\n'.join(x))
@Erfan의 좋은 답변에 따라 집계 값을 분석할 때 기존 문자 값의 가능한 조합을 원하는 경우가 대부분입니다.
unique_chars = lambda x: ', '.join(x.unique())
(df
.groupby(['A'])
.agg({'C': unique_chars}))
언급URL : https://stackoverflow.com/questions/17841149/pandas-groupby-how-to-get-a-union-of-strings
'programing' 카테고리의 다른 글
| Windows 7에서 WMI/powershell을 사용하여 화면 해상도 가져오기 (0) | 2023.10.22 |
|---|---|
| Git가 파일을 이진 파일로 취급하도록 하려면 어떻게 해야 합니까? (0) | 2023.10.22 |
| 각 루프별로 mysql 결과 집합 데이터에 액세스하는 방법 (0) | 2023.10.22 |
| 문자열은 VBA에서 반복할 수 있는 배열입니까? (0) | 2023.10.17 |
| 중첩된 키가 딕트에 존재하는지 확인하는 우아한 방법? (0) | 2023.10.17 |