在Pandas中,如何计算给定另一列的一组值的概率?

2024-04-29 13:59:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个DataFrame,其中的行表示交通事故。其中两列是WeatherSkidding

import pandas as pd

df = pd.DataFrame({'Weather': ['rain', 'fine', 'rain', 'fine', 'snow', 'fine', 'snow'],
                   'Skidding': ['skid', 'skid', 'no skid', 'no skid', 'skid', 'no skid', 'jackknife']})

我想计算一下下雨或下雪时发生打滑或弯折的可能性有多大。到目前为止,我已经提出了一个使用布尔索引和四个辅助数据帧的解决方案:

^{pr2}$

对于本例,它的计算结果是relative_probability3.0。不过,这似乎没有必要冗长,我想重构它。在

我试过的一个方法是

counts = df.groupby('Weather')['Skidding'].value_counts()

relative_probability = (counts['rain']['skid'] + counts['snow']['skid']
    + counts['rain']['jackknife'] + counts['snow']['jackknife']) / (counts['fine']['skid'] + counts['fine']['jackknife'])

但是,这会导致KeyError,因为jackknife并不是在每种天气情况下都会出现,而且无论如何,写出所有的术语也是冗长的。实现这一目标的更好方法是什么?在


Tags: nodataframedfprobabilitypdweatherrelativecounts
1条回答
网友
1楼 · 发布于 2024-04-29 13:59:24

您可以使用isin代替... in ... for ...理解;如果只需要末尾的数字,也不需要过滤数据帧,只需构建条件sum和{}:

rain_snow = df.Weather.isin(['rain', 'snow'])
fine = df.Weather.eq('fine')
skid = df.Skidding.isin(['skid', 'jackknife'])
​
(rain_snow & skid).sum()/(fine & skid).sum()
# 3

相关问题 更多 >