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 循环:根据与列表值的匹配填充数据框行