Pandas 使用 for 循环在部分字符串匹配上设置列:使用包含 NaN 的向量进行错误索引

Posted

技术标签:

【中文标题】Pandas 使用 for 循环在部分字符串匹配上设置列:使用包含 NaN 的向量进行错误索引【英文标题】:Pandas set column on partial string match using for loop: Error indexing with vector containing NaN 【发布时间】:2018-04-09 21:31:31 【问题描述】:

我有一种使用部分字符串匹配来分配列的方法。我现在已经扩展了这个方法,以通过使用 for 循环来使用字符串列表,如下所示:

mydf:

         mytestdata Colourtoassign
0  blah Orange blah          FALSE
1     blah blah Red          FALSE

其中 Colourtoassign 是在 for 循环中使用列表 colourList 分配给部分字符串匹配的列:

['黑色', '蓝色', '绿色', '橙色', '粉红色', '紫色', '红色', '白色', '黄色', '粉红色']

我将其放入我的 for 循环中,如下所示:

for i in range(len(colourList)-1):
mydf.loc[mydf['mytestdata'].str.contains(colourList[i]), 'Colourtoassign'] = colourList[i]

为 mydf 生成所需的结果:

         mytestdata Colourtoassign
0  blah Orange blah         Orange
1     blah blah Red            Red

但是,当我尝试将它与我的真实数据一起使用时,如下例所示:

for i in range(len(cableList)-1):
ordersTwo.loc[ordersTwo['Variation details'].str.contains(cableList[i]), 'VariationStringLabel_FULL'] = cableList[i]

我收到错误 ValueError: cannot index with vector contains NA/NaN values

此数据框的相关列:

ordersTwo['变化详情']:

0                                                  NaN
1                                                  NaN
2    [Cable Length (metres):3M (9ft, 10in),Colour:Hot Pink]
3    [Cable Length (metres):2M (6ft, 7in),Colour:Hot Pink]

ordersTwo['VariationStringLabel_FULL']:

0    FALSE
1    FALSE
2    FALSE
3    FALSE

虽然我不相信它是发生索引的向量,但我尝试使用 ordersTwo['Variation details'] 删除 ordersTwo['Variation details'] 的 NaN .fillna(0, inplace=True) 但结果是一样的。

我的代码或方法有什么错误?

【问题讨论】:

【参考方案1】:

Series.str.contains(pat, case=True, flags=0, na=nan, regex=True)

其中na:默认NaN,缺失值的填充值。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.contains.html

试试下面的代码:

for i in range(len(cableList)-1):
    ordersTwo.loc[ordersTwo['Variation details'].str.contains(cableList[i], na=False), 'VariationStringLabel_FULL'] = cableList[i]

【讨论】:

以上是关于Pandas 使用 for 循环在部分字符串匹配上设置列:使用包含 NaN 的向量进行错误索引的主要内容,如果未能解决你的问题,请参考以下文章

Python、Pandas 和 for 循环:根据与列表值的匹配填充数据框行

使用作为字符串一部分的整数迭代 for 循环

Pandas:使用部分字符串匹配聚合不同数据帧的几列

Pandas for 在组上循环

如何在 Pandas 中使用 For 循环 KEY 命名 DataFrame

嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据