我有DataFrame
,其中行代表交通事故。其中两列是Weather
和Skidding
:
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']})
我想计算在下雨或下雪时发生打滑或折叠的可能性与不下降时相比更有可能。到目前为止,我已经提出了使用布尔索引和四个辅助数据框的解决方案:
df_rainsnow = df[[weather in ('rain', 'snow') for weather in df.Weather]]
df_rainsnow_skid = df_rainsnow[[skid in ('skid', 'jackknife') for skid in df_rainsnow.Skidding]]
df_fine = df[df.Weather == 'fine']
df_fine_skid = df_fine[[skid in ('skid', 'jackknife') for skid in df_fine.Skidding]]
relative_probability = len(df_rainsnow_skid)/len(df_fine_skid)
对于此示例,其评估为relative_probability
3.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
并非在每种天气情况下都会发生,而且无论如何写出所有条款也很冗长。有什么更好的方法来实现这一目标?
答案 0 :(得分:1)
您可以使用isin
代替... in ... for ...
理解;如果您只需要最后的数字,也无需过滤数据框,只需构建条件sum
和divide
:
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