首页 > 解决方案 > 如何将函数应用于包含字符串的熊猫数据框列?

问题描述

我打开一个包含国家/地区列的 CSV 文件。

我想创建一个包含该国家 ISO3 代码的新列。

我可以通过安装来做到这一点

import country_converter as coco

它的工作方式如下:

coco.convert('Afghanistan')

返回

AFG

我现在想创建一个新列并将该功能应用于我所有的国家/地区以获得相应的 ISO3 代码。

我尝试通过以下方式执行此操作:

df['CODE'] = coco.convert(df['Country'])

所有这一切都是转换第一个国家代码 AFG 并将其添加到所有国家。

例子:

           Country        Date  Value CODE
0      Afghanistan  2020-03-12      7  AFG
1      Afghanistan  2020-03-11      7  AFG
2      Afghanistan  2020-03-10      5  AFG
3      Afghanistan  2020-03-09      4  AFG
4      Afghanistan  2020-03-08      4  AFG
5      Afghanistan  2020-03-07      1  AFG
6      Afghanistan  2020-03-06      1  AFG
7      Afghanistan  2020-03-05      1  AFG
8      Afghanistan  2020-03-04      1  AFG
9      Afghanistan  2020-03-03      1  AFG
10     Afghanistan  2020-03-02      1  AFG
11     Afghanistan  2020-03-01      1  AFG
12     Afghanistan  2020-02-29      1  AFG
13     Afghanistan  2020-02-28      1  AFG
14     Afghanistan  2020-02-27      1  AFG
15     Afghanistan  2020-02-26      1  AFG
16     Afghanistan  2020-02-25      1  AFG
17     Afghanistan  2020-02-24      1  AFG
18     Afghanistan  2020-02-23      0  AFG
19     Afghanistan  2020-02-22      0  AFG
20     Afghanistan  2020-02-21      0  AFG
21     Afghanistan  2020-02-20      0  AFG
22     Afghanistan  2020-02-19      0  AFG
23     Afghanistan  2020-02-18      0  AFG
24     Afghanistan  2020-02-17      0  AFG
25     Afghanistan  2020-02-16      0  AFG
26     Afghanistan  2020-02-15      0  AFG
27     Afghanistan  2020-02-14      0  AFG
28     Afghanistan  2020-02-13      0  AFG
29     Afghanistan  2020-02-12      0  AFG
...            ...         ...    ...  ...
20676      Vietnam  2020-02-20     16  AFG
20677      Vietnam  2020-02-19     16  AFG
20678      Vietnam  2020-02-18     16  AFG
20679      Vietnam  2020-02-17     16  AFG
20680      Vietnam  2020-02-16     16  AFG
20681      Vietnam  2020-02-15     16  AFG
20682      Vietnam  2020-02-14     16  AFG
20683      Vietnam  2020-02-13     16  AFG
20684      Vietnam  2020-02-12     15  AFG
20685      Vietnam  2020-02-11     15  AFG
20686      Vietnam  2020-02-10     14  AFG
20687      Vietnam  2020-02-09     13  AFG
20688      Vietnam  2020-02-08     13  AFG
20689      Vietnam  2020-02-07     10  AFG
20690      Vietnam  2020-02-06     10  AFG
20691      Vietnam  2020-02-05      8  AFG
20692      Vietnam  2020-02-04      8  AFG
20693      Vietnam  2020-02-03      8  AFG
20694      Vietnam  2020-02-02      6  AFG
20695      Vietnam  2020-02-01      6  AFG
20696      Vietnam  2020-01-31      2  AFG
20697      Vietnam  2020-01-30      2  AFG
20698      Vietnam  2020-01-29      2  AFG
20699      Vietnam  2020-01-28      2  AFG
20700      Vietnam  2020-01-27      2  AFG
20701      Vietnam  2020-01-26      2  AFG
20702      Vietnam  2020-01-25      2  AFG
20703      Vietnam  2020-01-24      2  AFG
20704      Vietnam  2020-01-23      2  AFG
20705      Vietnam  2020-01-22      0  AFG

[20706 行 x 4 列]

我也试过:

df['CODE'] = df['Country'].apply(coco.convert)

但这只是关闭了我的内核。

我该怎么做呢?

标签: python-3.xpandasdataframe

解决方案


您可以尝试GroupBy.transform为每组应用功能Country,想法是每组只运行一次功能以提高速度:

df['CODE'] = df.groupby('Country')['Country'].transform(coco.convert)

apply为我工作的解决方案也很慢:

df['CODE'] = df['Country'].apply(coco.convert)

性能

In [19]: %timeit df.groupby('Country')['Country'].transform(coco.convert)
60.2 ms ± 4.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [20]: %timeit df['Country'].apply(coco.convert)
1.2 s ± 6.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

推荐阅读