选择不等于零的不同pandas行中的最小值

时间:2017-04-18 17:09:11

标签: python pandas

我有一个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)

3 个答案:

答案 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的非数字列。