python - Pandas 数据框获取最后一个非零列的值

标签 python pandas dataframe

我有一个包含 3 列的 pandas 数据框,每列包含一个用户在 session 期间访问过的站点。

在某些情况下,用户可能没有在单个 session 中访问过 3 个站点。这由 0 表示,表示未访问任何站点。

import pandas as pd

df = pd.DataFrame(data=[[5, 8, 1],[8,0,0],[1,17,0]], 
                  columns=['site1', 'site2', 'site3'])
print(df)

   site1  site2  site3
0      5      8      1
1      8      0      0
2      1     17      0

在上面的示例中,用户 0 访问了站点 5、8 和 1。用户 1 仅访问了站点 8,用户 2 访问了站点 1 和 17。

我想创建一个新列 last_site,它显示用户在该 session 中最后访问的网站。

我想要的结果是这样的:

   site1  site2  site3  last_site
0      5      8      1          1
1      8      0      0          8
2      1     17      0         17

我怎样才能使用 pandas 以简洁的方式做到这一点?

最佳答案

使用前向填充通过替换 0 值创建的错误值,然后通过 iloc 选择最后一列:

df['last'] = df.replace(0, np.nan).ffill(axis=1).iloc[:, -1].astype(int)
print (df)
   site1  site2  site3  last
0      5      8      1     1
1      8      0      0     8
2      1     17      0    17

如果性能很重要,可以使用 numpy:

a = df.values
m = a != 0

df['last'] = a[np.arange(m.shape[0]), m.shape[1]-m[:,::-1].argmax(1)-1]
print (df)
   site1  site2  site3  last
0      5      8      1     1
1      8      0      0     8
2      1     17      0    17

关于python - Pandas 数据框获取最后一个非零列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53133183/

相关文章:

python - python - 如何对3列求和

python - 根据不同列中的值重复行

python - 跨python矩阵的行和列获取最大值

python - 美丽汤中的名称错误

python - Keras:绘制模型时出现断言错误

python - 如何使用 Python(使用 pandas 或其他方式)巧妙地匹配两个数据框?

python - 行中数字和字符串的最小值/最大值

python - 压缩的 Python 生成器,第二个更短 : how to retrieve element that is silently consumed

python - 根据条件比较列值

python - 如何重新索引 'multi - groupbyed' 数据帧?