在Pandas数据框中,如何获取满足特定条件的行(字符串)所占的百分比?

7

I have this data frame:

df = pd.DataFrame({"A": ["Used", "Not used", "Not used", "Not used", "Used",
                         "Not used", "Used", "Used", "Used", "Not used"],
                   "B": ["Used", "Used", "Used", "Not used", "Not used",
                        "Used", "Not used", "Not used", "Used", "Not used"]})

我想找到最快、最干净的方法来查找以下内容:

  • 使用A的所有行中占所有行的百分比。
  • 使用B的所有行中占所有行的百分比。
  • 同时使用A和B的所有行中占所有行的百分比。

我对Python和pandas(以及编程总体)都很新手,所以我确信这非常简单,但是任何指导都将不胜感激。我尝试过groupby().aggregate(sum),但没有得到我需要的结果(我想象是因为这些是字符而不是整数)。

2个回答

11
如果需要所有值的百分比,请使用value_countsnormalize=True,对于多个列,请使用groupbysize获取所有配对的长度,并将其除以df的长度(与索引长度相同):
print (100 * df['A'].value_counts(normalize=True))
Not used    50.0
Used        50.0
Name: A, dtype: float64

print (100 * df['B'].value_counts(normalize=True))
Not used    50.0
Used        50.0
Name: B, dtype: float64

print (100 * df.groupby(['A','B']).size() / len(df.index))
A         B       
Not used  Not used    20.0
          Used        30.0
Used      Not used    30.0
          Used        20.0
dtype: float64

如果需要过滤数值,请创建掩码并获取平均值 - True将被处理为1
print (100 * df['A'].eq('Used').mean())
#alternative
#print (100 * (df['B'] == 'Used').mean())
50.0

print (100 * df['B'].eq('Used').mean())
#alternative
#print (100 * (df['B'] == 'Used').mean())
50.0

print (100 * (df['A'].eq('Used') & df['B'].eq('Used')).mean())
20.0

6

使用

1)使用 A

In [4929]: 100.*df.A.eq('Used').sum()/df.shape[0]
Out[4929]: 50.0

2) 使用的B

In [4930]: 100.*df.B.eq('Used').sum()/df.shape[0]
Out[4930]: 50.0

3)已使用的A和已使用的B

In [4931]: 100.*(df.B.eq('Used') & df.A.eq('Used')).sum()/df.shape[0]
Out[4931]: 20.0

1) is same as

In [4933]: 100.*(df['A'] == 'Used').sum()/len(df.index)
Out[4933]: 50.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接