如何迭代数据集中存在Nan值的pandas列?(注意:我不能放弃南行)

lrl1mhuk  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(116)

我试图在pandas列中执行一个match函数,其中包含一个名为metalist的列表,结果显示错误“expected a string or a buffer”。
| meta|
| --------------|
| [Home、杂货店、蛋糕]|
| [Home、杂货、饼干]|
| 南|
| [Home、杂货店、苹果]|
metalist = ['Apple',' Cake','Biscuit']
我的预期输出是:
| meta|可用|
| --------------|--------------|
| [Home、杂货店、蛋糕]|真|
| [Home、杂货、饼干]|真|
| 南|假的|
| [Home、杂货店、苹果]|真|

66bbxpm5

66bbxpm51#

尝试使用布尔索引。另外,将metalist从list转换为set以加快搜索速度:

metalist = ['Apple', 'Cake', 'Biscuit']

mask = df['Meta'].notna()
metalist = set(metalist)
df.loc[~mask, 'Available'] = False
df.loc[mask, 'Available'] = df.loc[mask, 'Meta'].apply(lambda x: bool(metalist.intersection(x)))

print(df)

图纸:

Meta Available
0     [Home, Grocery, Cake]      True
1  [Home, Grocery, Biscuit]      True
2                       NaN     False
3    [Home, Grocery, Apple]      True
ws51t4hk

ws51t4hk2#

我将使用一个简单的条件和集合操作:

S = set(metalist)

df['Available'] = [isinstance(x, list) and bool(S.intersection(x))
                   for x in df['Meta']]

使用自定义函数的替代方法:

def overlap(s1, s2):
    try:
        return not s1.isdisjoint(s2)
    except TypeError:
        return False
    
S = set(metalist)

df['Available'] = [overlap(S, x) for x in df['Meta']]

输出:

Meta  Available
0     [Home, Grocery, Cake]       True
1  [Home, Grocery, Biscuit]       True
2                       NaN      False
3    [Home, Grocery, Apple]       True

相关问题