我有一个Panda DataFrame
ID Unique_Countries
0 123 [Japan]
1 124 [nan]
2 125 [US,Brazil]
.
.
.
我通过汇总每个ID组中的唯一国家获得了Unique_Countries列。在原始国家/地区列中有许多ID只有"NaN"值。它们现在显示为您在第1行中看到的内容。我想过滤这些,但似乎无法。当我键入时
df.Unique_Countries[1]
我得到
array([nan], dtype=object)
我试过几种方法,包括
isnull()
和isnan()
但它会被搞砸,因为它是一个numpy数组。
如果您的单元格的NaN
不在第一位,请尝试使用explode
和groupby.all
df[df.Unique_Countries.explode().notna().groupby(level=0).all()]
或
df[df.Unique_Countries.explode().notna().all(level=0)]
让我们试试
df.Unique_Countries.str[0].isna() #'nan' is True
df.Unique_Countries.str[0].notna() #'nan' is False
要只选择非nan字符串,只需使用上方的掩码
df[df.Unique_Countries.str[0].notna()]
我相信,如果一个国家包含子字符串nan,基于字符串方法contains
的答案将失败。
在我看来,解决方案应该是:
df.explode('Unique_Countries').dropna().groupby('ID', as_index=False).agg(list)
此代码将nan从数据帧中删除,并以原始形式返回数据集
从你的问题中,我不确定你是想删除na,还是想知道Unique_Countries列中有nan的记录的ID,你可以使用类似的东西:
long_ss = df.set_index('ID').squeeze().explode()
long_ss[long_ss.isna()]