Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在数据帧中获取非零值的最大列_Python_Pandas_Dataframe_Apply - Fatal编程技术网

Python 如何在数据帧中获取非零值的最大列

Python 如何在数据帧中获取非零值的最大列,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,我有这样一个数据帧: 2017 2018 2012 2015 2014 2016 11647 0.044795 0.000000 0.000000 0.0 0.0 0.0 16389 0.089801 0.044900 0.000000 0.0 0.0 0.0 16404 0.014323 0.000000 0.000000 0.0 0.04 0.0 16407 0.052479 0.010

我有这样一个数据帧:

           2017      2018      2012  2015  2014  2016
11647  0.044795  0.000000  0.000000   0.0   0.0   0.0
16389  0.089801  0.044900  0.000000   0.0   0.0   0.0
16404  0.014323  0.000000  0.000000   0.0   0.04   0.0
16407  0.052479  0.010442  0.009277   0.0   0.0   0.0
16409  0.000000  0.000000  0.004883   0.0   0.0   5.0
请注意,列没有排序。 对于每一行,我需要得到非零值的最近一年。 因此,预期结果是:

11647    2017
16389    2018
16404    2017
16407    2018
16409    2016
怎么做

df.apply(lambda row: row[row > 0].index.max(), axis=1)
给出了预期的结果


给出预期结果。

可以在排序列df中使用
idxmax

df[sorted(df.columns, reverse=True)].ne(0).idxmax(1)

11647    2017
16389    2018
16404    2017
16407    2018
16409    2016
dtype: object

可以在排序列中使用
idxmax

df[sorted(df.columns, reverse=True)].ne(0).idxmax(1)

11647    2017
16389    2018
16404    2017
16407    2018
16409    2016
dtype: object

使用
堆栈
最大值

df[df.ne(0)].stack().reset_index(level=1)['level_1'].max(level=0)
Out[386]: 
11647    2017
16389    2018
16404    2017
16407    2018
16409    2016
Name: level_1, dtype: int64
只是更新

df.ne(0).mul(df.columns).max(1)
Out[423]: 
11647    2017.0
16389    2018.0
16404    2017.0
16407    2018.0
16409    2016.0
dtype: float64

使用
堆栈
最大值

df[df.ne(0)].stack().reset_index(level=1)['level_1'].max(level=0)
Out[386]: 
11647    2017
16389    2018
16404    2017
16407    2018
16409    2016
Name: level_1, dtype: int64
只是更新

df.ne(0).mul(df.columns).max(1)
Out[423]: 
11647    2017.0
16389    2018.0
16404    2017.0
16407    2018.0
16409    2016.0
dtype: float64


问和回答你自己的问题没什么不对的。不管你说有什么不对的,只是引起了我的注意,你已经知道答案了answer@Yuca如果你认为你在回答一些其他地方没有涉及到的问题,那么这样开始这个过程是公平的。OP没有接受他们的答案,所以你也可以将其解读为“我发现了一个我认为没有答案的问题。这就是我解决问题的方式。我邀请你尝试”谢谢你roganjosh。我认为这个问题说明了为什么自我回答是好的。我遇到了一个我还没有找到答案的问题,然后我想出了一个答案,我想和其他人分享。然后我又得到了两个比我原来的解决方案快3倍和5倍的答案。这就是StackOverflow的力量:)@YucaAgree@DennisGolomazov,很高兴我们有了这个车队,询问和回答你自己的问题没什么错,不管你说有什么不对,我注意到你已经知道answer@Yuca如果你认为你在回答一些其他地方没有涉及到的问题,那么这样开始这个过程是公平的。OP没有接受他们的答案,所以你也可以将其解读为“我发现了一个我认为没有答案的问题。这就是我解决问题的方式。我邀请你尝试”谢谢你roganjosh。我认为这个问题说明了为什么自我回答是好的。我遇到了一个我还没有找到答案的问题,然后我想出了一个答案,我想和其他人分享。然后我又得到了两个比我原来的解决方案快3倍和5倍的答案。这就是StackOverflow的力量:)@YucaAgree@DennisGolomazov,很高兴我们有了这个车队谢谢。您的解决方案比我的(使用
apply
)快5.3倍。谢谢。您的解决方案比我的(使用
apply
)快5.3倍。谢谢。您的解决方案比我的快3.1倍(使用
apply
),但我接受的答案更快。@DennisGolomazov您想试试我的更新吗?如果速度很重要的话,我认为这个应该比idxmaxI更快,我很乐意尝试,但它似乎对我不起作用
mul
操作引发
***值错误:无法计算长度不等的数值运算
。这是为什么呢?
df.ne(0)
的形状是
(56,6)
,而
df.columns
是一个由6个元素组成的列表。@DennisGolomazov用您的示例进行试验,并与您原来的df进行比较,我认为数据帧是不同的,谢谢。您的解决方案比我的快3.1倍(使用
apply
),但我接受的答案更快。@DennisGolomazov您想试试我的更新吗?如果速度很重要的话,我认为这个应该比idxmaxI更快,我很乐意尝试,但它似乎对我不起作用
mul
操作引发
***值错误:无法计算长度不等的数值运算
。这是为什么呢?
df.ne(0)
的形状是
(56,6)
,而
df.columns
是一个由6个元素组成的列表。@DennisGolomazov用您的示例进行试验,并与您原来的df进行比较,我认为数据帧是不同的