Tính tỷ lệ phần trăm của các giá trị tương tự trong khung dữ liệu gấu trúc


14

Tôi có một khung dữ liệu df, với hai cột: Script (có văn bản) và Loa

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

Và tôi có danh sách sau đây: L = ['a','b','c']

Với đoạn mã sau,

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

Tôi có được khung dữ liệu này df2:

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

Tôi có thể thêm dòng nào vào mã của mình để nhận được, đối với mỗi dòng trong khung dữ liệu của tôi df2, giá trị phần trăm của tất cả các dòng được nói bởi người nói, để có khung dữ liệu sau df3:

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

Câu trả lời:


8

Bạn có thể chia sumtheo trục dọc đầu tiên và sau đó chuyển thành chuỗi và thêm %:

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%

5

Bắt đầu từ khung dữ liệu ban đầu của bạn, nếu bạn muốn% và không được tổng hợp các hình nộm, bạn có thể thay đổi toàn bộ tập lệnh như dưới đây:

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

Nếu bạn không muốn tỷ lệ phần trăm chỉ cần sử dụng:

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

Lưu ý: điều này sử dụng gấu trúc 0,25+ làm phiên bản


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

Đầu ra:

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

2

Cho ví dụ bạn có thể thử với dòng mã sau:

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

Với dữ liệu bạn cung cấp:

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)

Đầu ra:

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

Hoặc, nếu bạn muốn thêm biểu tượng '%':

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

Đầu ra:

      a     b    c
0   50%   25%  25%
1  100%    0%   0%
2    0%  100%   0%
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.