在DataFrame的每一列中获取第一个非零元素的值和索引(从上到下)是什么样的pandoric方法?
import pandas as pd
df = pd.DataFrame([[0, 0, 0],
[0, 10, 0],
[4, 0, 0],
[1, 2, 3]],
columns=['first', 'second', 'third'])
print(df.head())
# first second third
# 0 0 0 0
# 1 0 10 0
# 2 4 0 0
# 3 1 2 3
我想要实现的目标:
# value pos
# first 4 2
# second 10 1
# third 1 3
答案 0 :(得分:2)
您正在寻找idxmax
,它会为您提供最大值的第一个位置。但是,您需要找到“不等于零”的最大值
df.ne(0).idxmax()
first 2
second 1
third 3
dtype: int64
结合使用
df.ne(0).idxmax().to_frame('pos').assign(val=lambda d: df.lookup(d.pos, d.index))
pos val
first 2 4
second 1 10
third 3 3
相同的答案包装略有不同。
m = df.ne(0).idxmax()
pd.DataFrame(dict(pos=m, val=df.lookup(m, m.index)))
pos val
first 2 4
second 1 10
third 3 3
答案 1 :(得分:2)
这是longwinded方式,如果你的非零值往往发生在大数组的开头附近,它应该更快:
import pandas as pd
df = pd.DataFrame([[0, 0, 0],[0, 10, 0],[4, 0, 0],[1, 2, 3]],
columns=['first', 'second', 'third'])
res = [next(((j, i) for i, j in enumerate(df[col]) if j != 0), (0, 0)) for col in df]
df_res = pd.DataFrame(res, columns=['value', 'position'], index=df.columns)
print(df_res)
value position
first 4 2
second 10 1
third 3 3
答案 2 :(得分:2)
我将使用stack
,index用于行号和列号
df[df.eq(df.max(1),0)&df.ne(0)].stack()
Out[252]:
1 second 10.0
2 first 4.0
3 third 3.0
dtype: float64