पांडा डेटाफ्रेम में समान मूल्यों के प्रतिशत की गणना करें


14

मेरे पास एक डेटाफ्रेम है 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

जवाबों:


8

आप 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%

5

अपनी मूल डेटाफ़्रेम से शुरू करके, यदि आप% चाहते हैं और डमी की समूहीकृत राशि नहीं चाहते हैं, तो आप नीचे दी गई संपूर्ण स्क्रिप्ट को बदल सकते हैं:

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+ का उपयोग करता है


3
(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

2

उदाहरण को देखते हुए आप निम्न लाइन कोड के साथ प्रयास कर सकते हैं:

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%
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.