1つのデータフレームdf
があり、2つの列があります。スクリプト(テキスト付き)とスピーカー
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
注:これはバージョンとしてpandas 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%