pandas 挣扎于字符串切片和使用列表解析

5vf7fwbs  于 2023-09-29  发布在  其他
关注(0)|答案(2)|浏览(103)

我目前正在从一个数据集开发一个pandas数据框架,其中包括从2012年开始的德国进出口收入。为了清楚起见,我想再加上一栏“大洲”,并为每个国家指定其位置。我的数据框是按国家和年份排序的。代码片段如下所示:
| 国家|代码|......这是什么?|大陆|
| --|--|--|--|
| 阿富汗|ST423|......这是什么?|4 <--预期结果|
“代码”中的第三个字符定义了大陆:欧洲1个,非洲2个,美洲3个,亚洲4个,大洋洲5个。我正在尝试用大陆名称填写“大陆”一栏。
我尝试的是首先创建一个系列的列表“代码”

codelist = df["Code"].to_list()

然后我尝试(在未能实现我的目标后)至少将数字添加到该列,因此“代码”中每个值的第三个符号。但即使在这里,我也没有这样做:

[codelist[x][2] for x in range(0,len(codelist)-1)]

它指出:“IndexError:字符串索引超出范围”,我不明白,因为

codelist[0][2]

codelist[len(codelist)-1][2]

两者都给予了积极的结果。

vulvrdjw

vulvrdjw1#

这是因为列Code肯定至少包含一个长度小于3的字符串。

Country   Code
0  Afghanistan  ST423
1            A     ST
2            B   None
3            C    XXX

      1 codelist = df["Code"].to_list()
----> 2 [codelist[x][2] for x in range(0,len(codelist)-1)]

IndexError: string index out of range

您可以使用str/map

d = dict(enumerate(["Europe", "Africa", "Americas", "Asia", "Oceania"], 1))

df["Continent"] = pd.to_numeric(df["Code"].str[2], errors="coerce").map(d)

extract的另一个变体:

df["Continent"] = df["Code"].str.extract(
            "..(\d)", expand=False).astype("Int8").map(d)

或者,如果你更喜欢 listcomp,你可以通过添加一个if/else语句来修复你的代码:

df["Continent"] = [
    d.get(int(c[2])) if c and len(c)>2 and c[2].isdigit()
    else None for c in df["Code"] # <-- change None if needed
]

输出量:

print(df)

       Country   Code Continent
0  Afghanistan  ST423      Asia
1            A     ST       NaN
2            B   None       NaN
3            C    XXX       NaN

使用的输入:

df = pd.DataFrame(
    {'Country': ['Afghanistan', 'A', 'B', 'C'],
     'Code': ['ST423', 'ST', None, 'XXX']}
)
q3aa0525

q3aa05252#

正如其他人所说,在某个地方,你有一个少于3个字符的Code。如果你不介意使用一个空字符串来表示欧洲大陆,这很容易修复:

[codelist[x][2:3] for x in range(0,len(codelist)-1)]

切片很有趣。如果您请求一个不存在的索引,则会得到IndexError。但是如果你请求一个不存在的范围,你会得到一个空的结果。所以只需要使用一个长度为单个字符的范围。

相关问题