pandas isin() 方法返回具有 NaN 值的行

pandas isin() method returning rows with NaN values

我有一个数据框 df_data 和一个列表 l_idsdf_data.head() 如下所示:

l_lids[:5][224960004, 60032008, 26677001, 162213003, 72405004]

我想获取列表 l_ids 中存在 l_id 的行。

所以我这样做:df_temp = df_data[df_data.isin(l_ids)]

但是,df_temp 中有包含 NaN 的行。事实上,text字段的所有行都是NaN。这是 df_temp.head() 的样子:

交叉检查:

print(79823003 in l_ids, 224960004 in l_ids)
True, True

据我们所知,l_ids[0]224960004,它存在于 df_temp 中,但它现在是 float,对应的 textNaN。与 79823003 和其他 ID 相同。

为什么会这样?我过去也遇到过同样的错误,但我通过其他方式获得了行并忽略了错误。但是现在在一个不相关的项目中又发生了,我觉得我在这里做错了。

额外信息

df_data.info() returns:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 3577942 entries, 0 to 6953898
Data columns (total 2 columns):
text       object
l_id    int64
dtypes: int64(1), object(1)

df_temp.info() returns:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 3577942 entries, 0 to 6953898
Data columns (total 2 columns):
text       object
l_id    float64
dtypes: float64(1), object(1)

因此 l_id 字段的数据类型从 int64 更改为 float64

你的陈述应该是这样的:

df_temp = df_data[df_data['l_id'].isin(l_ids)]

如果列 l_id 的值出现在列表 l_ids 和 return 对应的行中,条件为真,这将检查每一行。您的错误是在整个数据帧 df_data 上调用 isin() 而不仅仅是 df_data['l_id'].

解决问题的另一种方法:

import pandas as pd

df = pd.DataFrame({
    'text': ['aa', 'bb', 'cc', 'dd'],
    'l_id': [1, 2, 3, 4],
})

ids = [2, 3]

df[df.apply(lambda x: x['l_id'] in ids, axis=1)]