[英]How to change value in pandas DataFrame dependent on if clause in a for loop
我想分析一个兰花列表(input_df),如果它包含六个列表之一的兰花物种。 我从一个 xlsx 文件中导入这些列表,其中包含六张纸作为字典,其中包含作为 DataFrames (orchid_checklists) 的六个列表。
import pandas as pd
orchid_checklists = pd.read_excel('\\orchid_checklists.xlsx', sheet_name=None)
input_df = pd.read_excel('\\input.xlsx')
input_df['Orchideen-Checkliste'] = ''
使用以下带有 if 条件的 for 循环,我试图将清单的名称添加到与 ['Orchideen-Checkliste'] 列中 input_df['Input Name'] 中的项目相对应的字段中,以可视化应该查看的清单参考。
for item in input_df['Input Name']:
for list_name, sheet in orchid_checklists.items():
genus = item.split(' ')[0]
if genus in sheet['referenced'].values:
input_df['Orchideen-Checkliste'] = list_name
else:
pass
在我的测试输入列表中,应该找到一种名为“Bulbophyllum pachyrachis”的物种。 不幸的是,列表“CL_Bulbophyllum”的名称被放入所有行中。 我想不通为什么。
在下一步中,我想检查物种名称是否也在我的任一清单中的“例外”列中。 在这种情况下,这将不是正确的清单。 在这些情况下,完整的物种名称(例如“Aerangis ellisii”,参见下面的 CL_App_I 和 CL_III)可以在另一个列表的“参考”栏中找到。 我还没有开始编写这个异常,因为我之前仍然坚持这个部分,但是任何如何解决这个问题的指针都非常受欢迎。
这是输入数据:
Input Name Orchideen-Checkliste
0 Sobralia madisonii
1 Stelis cocornaensis
2 Stelis gelida
3 Braemia vittata
4 Brassia escobariana
5 Aspasia silvana
6 Bulbophyllum maximum
7 Bulbophyllum pachyrachis
8 Chondroscaphe amabilis
9 Dresslerella hispida
10 Elleanthus sodiroi
11 Maxillaria mathewsii
兰花清单:
CL_III
referenced exceptions
0 Aerangis Aerangis ellisii
1 Angraecum NaN
2 Ascocentrum NaN
3 Bletilla NaN
4 Brassavola NaN
5 Calanthe NaN
6 Catasetum NaN
7 Miltonia NaN
8 Miltoniopsis NaN
9 Renanthera NaN
10 Renantherella NaN
11 Rhynchostylis NaN
12 Rossioglossum NaN
13 Vanda NaN
14 Vandopsis NaN
CL_App_I
referenced exceptions
0 Paphiopedilum NaN
1 Phragmipedium NaN
2 Aerangis ellisii NaN
3 Cattleya jongheana NaN
4 Cattleya lobata NaN
5 Dendrobium cruentum NaN
6 Mexipedium xerophyticum NaN
7 Peristeria elata NaN
8 Renanthera imshootiana NaN
CL_Bulbophyllum
referenced exceptions
0 Acrochaene NaN
1 Bulbophyllum NaN
2 Chaseella NaN
3 Codonosiphon NaN
4 Drymoda NaN
5 Monomeria NaN
6 Monosepalum NaN
7 Pedilochilus NaN
8 Succoglossum NaN
9 Sunipia NaN
10 Trias NaN
预先感谢您的帮助!
input_df['Orchideen-Checkliste'] = list_name
为该列的每个项目分配一个值,因为您没有指定行索引器。
无需过多更改您的流程:迭代时枚举input_df['Input Name']
中的项目并使用枚举指定分配的行。
for index,item in enumerate(input_df['Input Name']):
for list_name, sheet in orchid_checklists.items():
genus = item.split(' ')[0]
if genus in sheet['referenced'].values:
input_df.loc[index,'Orchideen-Checkliste'] = list_name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.