首页 > 解决方案 > 如何获取熊猫中最后一个非零值的列名?

问题描述

我有一些顺序特征的数据,这些特征必须在其他特征出现之前出现。我想获取用户访问的最终页面。

设置

import numpy as np
import pandas as pd


df = pd.DataFrame({'user': [10,15,17],
                  'sex': ['M','M','F'],
                  'home_page': [1,1,1],
                  'search_page': [1,0,1],
                  'confirmation_page': [1,0,0],
                  'payment_page':[1,0,0]})
print(df)

   user sex  home_page  search_page  confirmation_page  payment_page
0    10   M          1            1                  1             1
1    15   M          1            0                  0             0
2    17   F          1            1                  0             0

问题

如何获取名称为“final_page”的新列,该列具有访问的最终页面的名称。

必填答案

df['final_page'] = ['payment_page','home_page','search_page'] # this is not answer,
# The new column should have these values.

我的尝试

a = df.iloc[:,2:].to_numpy()
np.trim_zeros(a)

相关链接

在熊猫系列中查找最后一个非零元素的索引

标签: pythonpandasnumpy

解决方案


您可以使用dot条件 where 列的乘积,df!=0然后拆分并获取最后一列:

m=df.set_index(['user','sex'],append=True)
df['final_page']=(m.ne(0).dot(m.columns+ ',').str.rstrip(',').str.split(',')
                                     .str[-1].droplevel(['user','sex']))
print(df)

或者:

df['final_page']=m.apply(pd.Series.last_valid_index,axis=1).reset_index(drop=True)

   user sex  home_page  search_page  confirmation_page  payment_page  \
0    10   M          1            1                  1             1   
1    15   M          1            0                  0             0   
2    17   F          1            1                  0             0   

     final_page  
0  payment_page  
1     home_page  
2   search_page  

推荐阅读