【问题标题】:Using dictionary to replace items in Series object, based on condition from another Series根据另一个系列的条件,使用字典替换系列对象中的项目
【发布时间】:2020-02-03 05:03:27
【问题描述】:

我有一个包含一系列州和一系列国家的数据框。 Country 系列有多个缺失值。我有一本美国各州词典,我用来清理美国系列。我想用它来表示,如果字典中有国家,那么国家应该是美国。

我可以使用映射到美国的州字典,即{'AL': 'USA', 'AK': 'USA' ...} 然后使用df['Country']= df['Country'].map(dict),但我确信有更好/更智能/更简单的方法来做到这一点。

我试过了:

test = df[['State', 'Country']]
for a, b in test.itertuples(index=False):
    if a in us_state_abbrev.values():
        b = "USA"
    elif a in ca_province_abbrev.values():
        b = "Canada"

test.head() 返回的位置:

         State       Country
0          MO           NaN
1          IA           USA
2          MI           NaN
3          AB        Canada
4          ON        Canada

us_state_abbrev = {'Alabama': 'AL', 'Alaska': 'AK' ...}

但没有任何变化,尽管 if-else 语句有效。这是为什么呢?

我也试过了:

test['Country'] = np.where(test['State'] in us_state_abbrev.values(), "USA", test['Country'])

但我得到一个 ValueError:一个系列的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。这是为什么呢?

【问题讨论】:

  • 如果您仅有的两个选项是“美国”或“加拿大”,那么您可以确定没有出现在多个国家/地区的模棱两可的州缩写,那么使用map() 是非常合适的。至于您的特定语法错误:如果您发布一个重现您的错误的代码的工作示例,您会得到更好的响应,不要让我们猜测您的数据框中有什么。
  • 谢谢@Jewly,但难道不应该有更简单的方法来使用 state_abbrev 字典而不是创建一个全新的 {state: USA} 字典吗?为澄清起见,我将编辑问题以显示 test.head()

标签: python pandas numpy dictionary series


【解决方案1】:

不要使用in。你需要isinnp.where

us_state_abbrev = {'Alabama': 'AL', 'Alaska': 'AK', 'IOWA': 'IA', 'Mississippi': 'MI', 'Missouri': 'MO'}

test['Country'] = np.where(test['State'].isin(us_state_abbrev.values()), "USA", test['Country'])

Out[143]:
  State Country
0    MO     USA
1    IA     USA
2    MI     USA
3    AB  Canada
4    ON  Canada

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2021-07-13
    • 1970-01-01
    • 2023-03-11
    • 2016-08-19
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多