下面是我的代码
years_list = set()
for i in range(0,indicators_csv.shape[0]) :
if (indicators_csv['CountryCode'].str.contains('USA')) :
years_list.append(indicator_csv.iloc[i].Year)
这里indicator_csv是一个csv文件,其列为“ CountryCode” 运行此命令时出现以下错误
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
在if行上。我也尝试过
if (indicators_csv['CountryCode'] == ('USA'))
,但出现相同的错误。
我用谷歌搜索后发现一些与数字或和/或但与我发现的东西无关的答案。
答案 0 :(得分:2)
如果我对您的理解是正确的,并且希望遍历df而不是使用矢量化方法,则可以使用:
years_list = []
for index, row in indicators_csv.iterrows():
if ('USA' in row['CountryCode']):
years_list.append(row['Year'])
输入:
CountryCode Year
0 USA 1980
1 UK 1990
2 FR 1984
3 USA 2000
输出:
[1980L, 2000L]
答案 1 :(得分:1)
您应该尝试避免尽可能多地遍历pandas
对象-它比本机矢量化操作慢。您的问题是indicators_csv['CountryCode'].str.contains('USA')
每行都要检查'USA'
是否在'CountryCode'
中,因此最终会出现一列True和False条目。
您要做的是将数据框过滤为仅包含'USA'
的那些行,然后将'Year'
列从该帧转换为列表。您可以通过一项操作直接完成所有这些操作(为了便于阅读,请分成两行)
years_list = indicators_csv[indicators_csv['CountryCode'].str.contains('USA')]\
['Year'].tolist()
答案 2 :(得分:0)
由于您试图在需要单个布尔值的IF子句中使用一系列布尔值,因此引发了错误。