获取 pandas 数据框中满足特定条件的行(字符串)的百分比
Get percentage of rows (strings) that fulfil a certain condition in a pandas 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) 但我没有得到我需要的结果(我想是因为这些是字符而不是整数。
使用
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) 等同于
In [4933]: 100.*(df['A'] == 'Used').sum()/len(df.index)
Out[4933]: 50.0
如果需要所有值百分比,则对所有对的长度使用 value_counts
with normalize=True
, for multiple columns groupby
with size
并将其除以 length of 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
如果需要过滤器值,创建掩码并获取 mean
- True
s 的处理方式类似于 1
s:
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
我有这个数据框:
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) 但我没有得到我需要的结果(我想是因为这些是字符而不是整数。
使用
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) 等同于
In [4933]: 100.*(df['A'] == 'Used').sum()/len(df.index)
Out[4933]: 50.0
如果需要所有值百分比,则对所有对的长度使用 value_counts
with normalize=True
, for multiple columns groupby
with size
并将其除以 length of 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
如果需要过滤器值,创建掩码并获取 mean
- True
s 的处理方式类似于 1
s:
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