【问题标题】:check if country code contains given string检查国家代码是否包含给定的字符串
【发布时间】:2018-08-13 10:21:24
【问题描述】:

下面是我的代码

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'))

但得到同样的错误。

我用谷歌搜索了一些与数字或和或相关的答案,但没有找到类似的答案。

【问题讨论】:

  • indicators_csv 是熊猫系列吗?
  • @saravanakumarv 没有它的熊猫数据框
  • 抛出错误是因为您试图在需要单个布尔值的 IF 子句中使用一系列布尔值。

标签: python-3.x pandas data-science


【解决方案1】:

如果我理解正确并且您想迭代 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]

【讨论】:

    【解决方案2】:

    您应该尽量避免迭代 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()
    

    【讨论】:

      【解决方案3】:

      错误正在抛出,因为您试图在 IF 子句中使用一系列布尔值,它需要单个布尔值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        • 2011-06-03
        • 2018-06-14
        • 1970-01-01
        • 2011-03-08
        • 2023-03-09
        • 2020-09-16
        相关资源
        最近更新 更多