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进行比较,我认为数据帧是不同的