如何用pandas对象中的子串替换值?

elb*_*kim 3 python dataframe pandas

我在Latitude数据集中有坐标,每个数据集都以字母结尾(例如N).

仅检索数字并替换原始值的最佳方法是什么?

我的尝试是:

raw['LATITUDE'] = raw.loc[(raw['LATITUDE'].str.len() == 9)].str[0:8]
Run Code Online (Sandbox Code Playgroud)

但是我得到了一条AttributeError消息.

AttributeError: 'DataFrame' object has no attribute 'str'
Run Code Online (Sandbox Code Playgroud)

我也尝试用正则表达式替换值,但我不确定如何使它成功.

我很感激任何建议,谢谢.

在此输入图像描述

cs9*_*s95 5

好的,让我们澄清一些事情:

  1. 你好像在使用混合dtypes.打印raw['LATITUDE'].apply(type).nunique()确认; 它应该> 1.

  2. 您正在使用地理数据.你的许多值都是无效的(0),我建议将其强制转换为NaN,因为它更有意义地代表缺失的数据

要解决您的问题,请尝试将所有内容添加到最后一个字符(:-1):

raw['LATITUDE'] = raw['LATITUDE'].str[:-1].astype(float)
raw

   LATITUDE
0       NaN
1  38.72496
2  39.90272
3  38.72927
4  39.91152
5  39.84841
6       NaN
7       NaN
8       NaN
9  39.84941
Run Code Online (Sandbox Code Playgroud)

这工作虽然混合dtypes你的塔中,因为str访问被设计成非字符串行强制为NaN.

如果你想保留0(我不推荐),使用快速替换功能,如np.where;

raw['LATITUDE'] = np.where(
    raw.LATITUDE.eq(0), 0, raw['LATITUDE'].str[:-1].astype(float)
)

raw
   LATITUDE
0   0.00000
1  38.72496
2  39.90272
3  38.72927
4  39.91152
5  39.84841
6   0.00000
7   0.00000
8   0.00000
9  39.84941
Run Code Online (Sandbox Code Playgroud)

我不建议保留0的原因是因为使用NaN划分缺失数据而不是0来在语义上更有意义.