我有一个 Pandas DataFrame:
import pandas as pd
df = pd.DataFrame([[0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0],
[1.0, 0.0, 1.0, 3.0, 1.0, 1.0, 7.0, 0.0],
[0.0, 0.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0]
]
, columns=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'])
A B C D E F G H
0 0.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0
1 1.0 0.0 1.0 3.0 1.0 1.0 7.0 0.0
2 0.0 0.0 13.0 14.0 15.0 16.0 17.0 18.0
我想返回每一行中第一个非零值的系列(而不是列表)。这样可以实现,但是lookup
返回的是一个列表,而不是一个系列(我知道我可以将列表转换为系列),但我认为应该有更好的方法:
first_nonzero_colnames = (df > 0).idxmax(axis=1, skipna=True)
df.lookup(first_nonzero_colnames.index, first_nonzero_colnames.values)
[ 2. 1. 13.]
我可以使用.apply
,但我想避免它。
df.replace(0, np.nan).bfill(1).iloc[:, 0]
。 - piRSquareddf.mask(df == 0).bfill(1).iloc[:,0]
,但是我只是被打败了一点点! - root%%timeit
,我的建议只需要三分之一的时间,但是概念是相同的。我不介意您把它包含在您的答案中。 - piRSquared