我有一个数据帧(df)
df = pd.DataFrame({'No': [123,234,345,456,567,678], 'text': ['60 ABC','1nHG','KL HG','21ABC','K 200','1g HG'], 'reference':['ABC','HG','FL','','200',''], 'result':['','','','','','']}, columns=['No', 'text', 'reference', 'result'])
No text reference result
0 123 60 ABC ABC
1 234 1nHG HG
2 345 KL HG FL
3 456 21ABC
4 567 K 200 200
5 678 1g HG
以及一个包含元素的列表
list
['ABC','HG','FL','200','CP1']
现在我有以下代码:
for idx, row in df.iterrows():
for item in list:
if row['text'].strip().endswith(item):
if pd.isnull(row['reference']):
df.at[idx, 'result'] = item
elif pd.notnull(row['reference']) and row['reference'] != item:
df.at[idx, 'result'] = 'wrong item'
if pd.isnull(row['result']):
break
我浏览了df和列表,检查是否匹配。你知道吗
输出:
No text reference result
0 123 60 ABC ABC
1 234 1nHG HG
2 345 KL HG FL wrong item
3 456 21ABC ABC
4 567 K 200 200
5 678 1g HG HG
break指令很重要,因为否则在列表中会找到第二个元素,然后第二个元素将覆盖结果中的内容。你知道吗
现在我需要另一个解决方案,因为数据帧很大,for循环效率很低。认为使用apply可以工作,但如何?你知道吗
谢谢你!你知道吗
您可以迭代后缀,而不是迭代行,这可能是一个小得多的iterable。这样,就可以利用基于序列的方法和布尔索引。你知道吗
我还创建了一个额外的序列来标识行何时被更新。与按行迭代的开销相比,这个额外检查的开销应该很小。你知道吗
结果:
您可以删除最后一列,但可能会发现它对其他用途有用。你知道吗
相关问题 更多 >
编程相关推荐