【问题标题】:Replace specific values in a panda column with a value determined by a function将 panda 列中的特定值替换为由函数确定的值
【发布时间】:2022-06-19 02:14:32
【问题描述】:

我的数据如下:

import pandas as pd
import country_converter as coco
cc = coco.CountryConverter()

example = pd.DataFrame.from_dict({'Country': {0: 'Fiji', 1: 'Tanzania', 2: 'W. Sahara', 3: 'Canada', 4: 'United States of America', 5: 'Kazakhstan', 6: 'Uzbekistan', 7: 'Papua New Guinea', 8: 'Indonesia', 9: 'Argentina', 10: 'Chile', 11: 'Dem. Rep. Congo', 12: 'Somalia', 13: 'Kenya', 14: 'Sudan', 15: 'Chad', 16: 'Haiti', 17: 'Dominican Rep.', 18: 'Russia', 19: 'Bahamas', 20: 'Falkland Is.', 21: 'Norway'}, 'iso': {0: 'FJI', 1: 'TZA', 2: 'ESH', 3: 'CAN', 4: 'USA', 5: 'KAZ', 6: 'UZB', 7: 'PNG', 8: 'IDN', 9: 'ARG', 10: 'CHL', 11: 'COD', 12: 'SOM', 13: 'KEN', 14: 'SDN', 15: 'TCD', 16: 'HTI', 17: 'DOM', 18: 'RUS', 19: 'BHS', 20: 'FLK', 21: '-99'}}
)

                     Country  iso
0                       Fiji  FJI
1                   Tanzania  TZA
2                  W. Sahara  ESH
3                     Canada  CAN
4   United States of America  USA
5                 Kazakhstan  KAZ
6                 Uzbekistan  UZB
7           Papua New Guinea  PNG
8                  Indonesia  IDN
9                  Argentina  ARG
10                     Chile  CHL
11           Dem. Rep. Congo  COD
12                   Somalia  SOM
13                     Kenya  KEN
14                     Sudan  SDN
15                      Chad  TCD
16                     Haiti  HTI
17            Dominican Rep.  DOM
18                    Russia  RUS
19                   Bahamas  BHS
20              Falkland Is.  FLK
21                    Norway  -99

我希望 python 尝试:

example['iso'] = cc.convert(names = example['Country'], to = 'ISO3')

如果iso=-99的值

我看到this solution,所以我尝试了:

example = example.assign(col = [(cc.convert(names = example['Country'], to = 'ISO3')) if iso = '-99' else (example['iso']) for iso in example['iso']])

但这不是正确的语法。

有人可以帮帮我吗?

【问题讨论】:

  • example.loc[example['iso'] == '-99', 'iso'] = 'ISO3'?
  • 定义一个小函数,试试apply方法
  • 感谢您的评论。但结果应该是函数的评估,而不是特定的字符串。我可以用函数替换字符串吗?

标签: python pandas


【解决方案1】:
def f(row):
    try:
        if int(row['iso']) == -99:
            return cc.convert(names=example[row['country']].strip(), to='ISO3')
    except:
        pass
    return row['iso']

example['iso'] = example.apply(f, axis=1)

如果你想提高计算效率,你可以运行

idx = example['iso'].apply(int) == -99
example['iso'][idx] = example[idx].apply(f, axis=1)

【讨论】:

  • 感谢您的回答。你测试过这个吗?对我来说,如果我应用这个解决方案,什么都不会改变。
  • -99 可能是字符串还是浮点值?
  • 我都试过了,因为我认为它会是一个字符串。
  • 我编辑了我的解决方案以将其转换为整数
  • 等待这行不通,让我再编辑一些:完成
【解决方案2】:
condition = df.iso.eq('-99')
df.iso.loc[condition] = df.Country[condition].apply(lambda x: cc.convert(x, to='ISO3'))

【讨论】:

  • 它似乎需要:cc.convert(x, to ='ISO3') 而不是 cc.convert(x, to ='ISO3')。有了这个改变,它现在可以工作了..
  • 我看不出你输入的两件事有什么不同,但我很高兴你能正常工作。
  • 错字.. cc.convert(x, to ='ISO3')而不是cc.convert(x, 'ISO3')
  • 啊,好吧,是的。我不知道country_converter 转换器是如何工作的,因为我曾经使用过它。如果它需要命名变量,那么应该给它命名变量。
【解决方案3】:

我会使用 np.select 来解决这个特殊问题

import pandas as pd
import numpy as np

example = pd.DataFrame.from_dict({'Country': {0: 'Fiji', 1: 'Tanzania', 2: 'W. Sahara', 3: 'Canada', 4: 'United States of America', 5: 'Kazakhstan', 6: 'Uzbekistan', 7: 'Papua New Guinea', 8: 'Indonesia', 9: 'Argentina', 10: 'Chile', 11: 'Dem. Rep. Congo', 12: 'Somalia', 13: 'Kenya', 14: 'Sudan', 15: 'Chad', 16: 'Haiti', 17: 'Dominican Rep.', 18: 'Russia', 19: 'Bahamas', 20: 'Falkland Is.', 21: 'Norway'}, 'iso': {0: 'FJI', 1: 'TZA', 2: 'ESH', 3: 'CAN', 4: 'USA', 5: 'KAZ', 6: 'UZB', 7: 'PNG', 8: 'IDN', 9: 'ARG', 10: 'CHL', 11: 'COD', 12: 'SOM', 13: 'KEN', 14: 'SDN', 15: 'TCD', 16: 'HTI', 17: 'DOM', 18: 'RUS', 19: 'BHS', 20: 'FLK', 21: '-99'}}
)
df = pd.DataFrame(example)
condition_list = [df['iso'] == '-99']
choice_list = ['ISO3']
#If the condition is met use the choice else keep the data as it is
df['iso'] = np.select(condition_list, choice_list, df['iso'])
df

【讨论】:

  • 感谢您的回答,但我认为这并不能真正回答我的问题。
  • 抱歉,我一定是误解了这个问题,如果“iso”列是“-99”,您是否要尝试将“Country”列更改为 ISO3?
猜你喜欢
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多