我有一个包含 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/