【发布时间】:2019-03-07 20:21:05
【问题描述】:
我有一个数据框 (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 可以工作,但如何?
谢谢!
【问题讨论】:
-
请不要对 DataFrame 使用 ascii 边框。相反,只需按照 shell 中的格式复制 DataFrame。
-
@Alex - 希望这是你的要求
标签: python pandas performance for-loop dataframe