假设我有一个数据帧,其中包含每个国家/地区的活动案例数与之前的值之间的差异:
[in]
import pandas as pd
import numpy as np
active_cases = {'Day(s) since outbreak':['0', '1', '2', '3', '4', '5'], 'Australia':[np.NaN, 10, 10, -10, -20, -20], 'Albania':[np.NaN, 20, 0, 15, 0, -20], 'Algeria':[np.NaN, 25, 10, -10, 20, -20]}
df = pd.DataFrame(active_cases)
df
[out]
Day(s) since outbreak Australia Albania Algeria
0 0 NaN NaN NaN
1 1 10.0 20.0 25.0
2 2 10.0 0.0 10.0
3 3 -10.0 15.0 -10.0
4 4 -20.0 0.0 20.0
5 5 -20.0 -20.0 -20.0我需要在这个新冠肺炎数据框中找到局部疫情达到高峰的平均天数。
我的解决方案是找到每列中第一个负值的第n行(例如,“澳大利亚”中第一个负值的第n行: 3,“阿尔巴尼亚”中第一个负值的第n行: 5),并对其进行平均。
但是,我不知道如何在Panda/Python中做到这一点。
有没有什么方法可以用简单的Python/Panda代码行来执行这个任务?
发布于 2020-05-02 09:21:03
您可以对列Day(s) since outbreak执行set_index操作,然后使用iloc选择除第一行之外的所有行,然后检查值小于(lt) 0的位置。使用idxmax获取值小于0的第一行,并获取mean。通过您的输入,它可以提供:
print (df.set_index('Day(s) since outbreak')\
.iloc[1:, :].lt(0).idxmax().astype(float).mean())
3.6666666666666665发布于 2020-05-02 09:40:12
使用df.where掩模负片并用np.NaN替换正片,然后计算平均值
cols= ['Australia','Albania','Algeria']
df.set_index('Day(s) since outbreak', inplace=True)
m = df< 0
df2=df.where(m, np.NaN)
#df2 = df2.replace(0, np.NaN)
df2.mean()结果

https://stackoverflow.com/questions/61553229
复制相似问题