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)
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)
| 归档时间: |
|
| 查看次数: |
826 次 |
| 最近记录: |