pandas isin() 方法返回具有 NaN 值的行
pandas isin() method returning rows with NaN values
我有一个数据框 df_data
和一个列表 l_ids
。 df_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
,对应的 text
是 NaN。与 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)]
我有一个数据框 df_data
和一个列表 l_ids
。 df_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
,对应的 text
是 NaN。与 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)]