numpy 如何在pandas中知道一个列的值既不是null也不是Nope或blank(每行)

wztqucjr  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(107)

有一个dataframe -这里我想找出最后一列填充,这既不是nan,null,blank也不是'Nope'每行明智的:

这里的输出是:
我尝试了apply,我以相反的顺序检查值是否为nan,null,blank或'Nope',然后删除列,否则中断循环并存储值。
我想找到一个更快的方法来做到这一点,因为我是新的Pandas
可复制输入:

df = pd.DataFrame({'a1': [1, 1, 1],
                   'a2': [float('nan'), 1, 1],
                   'a3': [1, 1, 1],
                   'a4': [1, 1, 1],
                   'a5': [1, 1, 1],
                   'a6': ['', 'Nope', 1],
                   'a7': ['', 1, '']})
d5vmydt9

d5vmydt91#

对于矢量解决方案,您可以使用isnull/isin构建掩码,然后在反向列上获取idxmax

m = ~(df.isnull() | df.isin(['Nope', '']))
# or
# m = df.notnull() & ~df.isin(['Nope', ''])

out = (m.iloc[:, ::-1].idxmax(axis=1)
        [m.any(axis=1)]
      )

如果您更喜欢在没有匹配项时屏蔽:

m = ~(df.isnull() | df.isin(['Nope', '']))

out = (m.iloc[:, ::-1].idxmax(axis=1)
        .where(m.any(axis=1))
      )

输出量:

0    a5
1    a7
2    a6
dtype: object
wj8zmpe1

wj8zmpe12#

nan替换被解释为nan的内容,然后获取指向固定值的行沿着最后一个索引,如sequence.index[~sequence.isna()][-1]

nan_values = ['Nope','']

last_solid_index = lambda df, axis: (
    df
    .mask(df.isin(nan_values))
    .apply(lambda x: x.index[x.notna()][-1], axis=axis)
)

让我们看看发布的数据:

nan = float('nan')
data = [
    [1,nan,1,1,1,    '',''],
    [1,  1,1,1,1,'Nope', 1],
    [1,  1,1,1,1,     1,''],
]
columns = [f'a{i}' for i in range(1, 8)]
df = pd.DataFrame(data, columns=columns)
print(last_solid_index(df, 'columns'))

输出:

0    a5
1    a7
2    a6
dtype: object

相关问题