[python] 팬더 데이터 프레임에서 유사한 값의 백분율 계산

df스크립트 (텍스트 포함) 및 스피커 : 두 개의 열 이있는 하나의 데이터 프레임이 있습니다.

Script  Speaker
aze     Speaker 1
art     Speaker 2
ghb     Speaker 3
jka     Speaker 1
tyc     Speaker 1
avv     Speaker 2
bhj     Speaker 1

그리고 나는 다음 목록을 가지고 있습니다 : L = ['a','b','c']

다음 코드를 사용하면

df = (df.set_index('Speaker')['Script'].str.findall('|'.join(L))
        .str.join('|')
        .str.get_dummies()
        .sum(level=0))
print (df)

이 데이터 프레임을 얻습니다 df2.

Speaker     a    b    c
Speaker 1   2    1    1
Speaker 2   2    0    0
Speaker 3   0    1    0

내 데이터 프레임의 각 라인에 df2대해 다음 데이터 프레임을 갖기 위해 화자가 말하는 모든 라인의 백분율 값 을 얻기 위해 코드에 어떤 라인을 추가 할 수 있습니까 df3?

Speaker     a    b    c
Speaker 1   50%  25%   25%
Speaker 2  100%    0   0
Speaker 3   0   100%   0



답변

sum첫 번째 축을 따라 나눈 다음 문자열로 캐스팅하고 추가 할 수 있습니다 %.

out = (df.set_index('Speaker')['Script'].str.findall('|'.join(L))
         .str.join('|')
         .str.get_dummies()
         .sum(level=0))

(out/out.sum(0)[:,None]).mul(100).astype(int).astype(str).add('%')

            a     b    c
Speaker
Speaker1   50%   25%  25%
Speaker2  100%    0%   0%
Speaker3    0%  100%   0%


답변

원래 데이터 프레임에서 시작하여 그룹화 된 합계가 아닌 %를 원하면 다음과 같이 전체 스크립트를 변경할 수 있습니다.

m = df.set_index('Speaker')['Script'].str.findall('|'.join(L)) #creates a list of matches
m = m.explode().reset_index() #explode to a series 
final = pd.crosstab(m['Speaker'],m['Script'],normalize='index').mul(100) # percentage pivot

Script         a      b     c
Speaker
Speaker 1   50.0   25.0  25.0
Speaker 2  100.0    0.0   0.0
Speaker 3    0.0  100.0   0.0

백분율을 원하지 않으면 다음을 사용하십시오.

pd.crosstab(m['Speaker'],m['Script'])

Script     a  b  c
Speaker
Speaker 1  2  1  1
Speaker 2  2  0  0
Speaker 3  0  1  0

참고 : 판다 0.25 이상을 버전으로 사용합니다.


답변

(df.set_index('Speaker')['Script'].str.extractall(f'({"|".join(L)})')
   .groupby('Speaker')[0].value_counts(normalize=True)
   .unstack(fill_value=0)
)

산출:

0            a     b     c
Speaker
Speaker 1  0.5  0.25  0.25
Speaker 2  1.0  0.00  0.00
Speaker 3  0.0  1.00  0.00


답변

예를 들어 다음 코드 줄을 사용해 볼 수 있습니다.

df = (df/df.sum(axis=1)[:, None]).mul(100).astype(int)

제공 한 데이터를 통해 :

import pandas as pd
import numpy as np
data = {'a':[2,2,0],'b':[1,0,1],'c':[1,0,0]}
df = pd.DataFrame(data)
df = (df/df.sum(axis=1)[:, None]).mul(100).astype(int)
print(df)

산출:

     a   b   c
0   50  25  25
1  100   0   0
2    0 100   0

또는 ‘%’기호를 추가하려는 경우 :

df = (df / df.sum(axis=1)[:, None]).mul(100).astype(int).astype(str) + '%'

산출:

      a     b    c
0   50%   25%  25%
1  100%    0%   0%
2    0%  100%   0%


답변