[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%