我有一个pandas数据帧:
year country apple orange peach banana pear export
2010 China 11 45 0 13 22 25
2011 China 6 5 26 33 2 44
2012 China 34 3 56 23 0 22
2013 China 22 45 2 2 27 14
我知道如何获得每年的最低价值,例如:
df["min_f"] = df[['apple', 'orange', 'peach', 'banana' ,'pear']].min(axis=1)
如何获得最小非零值?
P.S:我不想使用以下技巧,因为后来会产生头痛:df = df.replace(0, np.NaN)
答案 0 :(得分:2)
好的,我们选择列,得到非零值并找到min
(df[df[['apple', 'orange', 'peach', 'banana' ,'pear']] != 0]).min(axis = 1)
你得到了
year apple orange peach banana pear min_f
0 2010 11 45 0 13 22 11.0
1 2011 6 5 26 33 2 2.0
2 2012 34 3 56 23 0 3.0
3 2013 22 45 2 2 27 2.0
答案 1 :(得分:2)
icol = ['year', 'country']
f = lambda x: x != 0
mins = df.set_index(icol).stack().compress(f).groupby(level=[0, 1]).min()
df.join(mins.rename('min_f'), on=icol)
year country apple orange peach banana pear export min_f
0 2010 China 11 45 0 13 22 25 11
1 2011 China 6 5 26 33 2 44 2
2 2012 China 34 3 56 23 0 22 3
3 2013 China 22 45 2 2 27 14 2
答案 2 :(得分:1)
替代解决方案:
df.groupby(['year', 'country']).apply(lambda x: x[x > 0].min(axis=1))
返回:
year country
2010 China 0 11.0
2011 China 1 2.0
2012 China 2 3.0
2013 China 3 2.0
dtype: float64
这应该忽略使用pandas 0.19.2的非数字列。