迭代列并用提取的字符串替换值 [Pandas]

Fey*_*rov 5 python string replace python-3.x pandas

我有一个数据集,如下所示:

  A   B
1 aa  1234
2 ab  3456
3 bc  [1357, 2468]
4 cc  8901
...
Run Code Online (Sandbox Code Playgroud)

我需要迭代 B 列,并将方括号 ([]) 中的所有值替换为括号中的左四位数字,因此数据集将如下所示:

  A   B
1 aa  1234
2 ab  3456
3 bc  1357
4 cc  8901
...
Run Code Online (Sandbox Code Playgroud)

我有这个代码:

for item in df['B']:
if len(item) > 4:
    item_v = str(item[1:5])
    df['B'][item] = item_v 
    print(df['B'][item])
Run Code Online (Sandbox Code Playgroud)

它会打印截断的值,但是,如果我检查 df 的头部,它仍然具有旧值:

   > df['B'].head()

   >  A   B
    1 aa  1234
    2 ab  3456
    3 bc  [1357, 2468]
    4 cc  8901
    ...
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Joe*_*oka 2

最简单、最快的方法是使用 Pandas str.get()函数并为所需结果创建另一列。

解决方案#1B如果您的值是整数, 则第一个解决方案有效[1234,3456,[1357, 2468],8901]

df['C'] = df['B'].str.get(0).astype(float)
df.C.fillna(df['B'], inplace=True)
df['C'] = df.C.astype(int, inplace=True)
Run Code Online (Sandbox Code Playgroud)

输出:

A             B     C
0  aa          1234  1234
1  ab          3456  3456
2  bc  [1357, 2468]  1357
3  cc          8901  8901
Run Code Online (Sandbox Code Playgroud)

然后,如果不需要,可以删除 B 列。

解决方案 #2B如果您的值是字符串, 则此解决方案有效['1234','3456',['1357', '2468'],'8901']

import re
df['digits'] = df['B'].apply(lambda x: re.findall('\d+', str(x)))
df['digits'] = df['digits'].str.get(0)
print(df)
Run Code Online (Sandbox Code Playgroud)

输出:

   A             B    digits
0  aa          1234   1234
1  ab          3456   3456
2  bc  [1357, 2468]   1357
3  cc          8901   8901
Run Code Online (Sandbox Code Playgroud)

同样,如果不需要,您可以删除 B 列。