Pandas数据帧获取最后一个非零列的值

ksk*_*cou 11 python dataframe pandas

我有一个pandas数据框,其中包含3列,每列包含用户在会话期间访问过的站点.

在某些情况下,用户可能没有在一个会话中访问过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
Run Code Online (Sandbox Code Playgroud)

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

我想创建一个新列,last_site它显示用户在该会话中访问的最后一个站点.

我想要的结果是:

   site1  site2  site3  last_site
0      5      8      1          1
1      8      0      0          8
2      1     17      0         17
Run Code Online (Sandbox Code Playgroud)

如何使用熊猫以简洁的方式做到这一点?

jez*_*ael 15

使用通过替换值创建的misisng值的前向填充,然后通过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
Run Code Online (Sandbox Code Playgroud)

如果性能很重要,可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 这个前向填充逻辑在行中非常出色:) +1 (3认同)

Vis*_*dev 10

码:

df['last_site'] = df.apply(lambda x: x.iloc[x.nonzero()].iloc[-1], axis=1)
Run Code Online (Sandbox Code Playgroud)

输出:

   site1  site2  site3  last_site
0      5      8      1          1
1      8      0      0          8
2      1     17      0         17
Run Code Online (Sandbox Code Playgroud)

  • 好人@Vishnudev +1! (2认同)