programing

판다 그룹:줄 조합을 얻는 방법

jooyons 2023. 10. 22. 20:01
반응형

판다 그룹:줄 조합을 얻는 방법

다음과 같은 데이터 프레임이 있습니다.

   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

반응형