如何用Python提取字段纯数字及处理CSV的Cabin列
问题1:如何使用Python将包含字母和数字的字段转换为仅保留数字?
如果是处理pandas DataFrame中的列,最简洁高效的方式是借助正则表达式提取数字:
import pandas as pd # 假设你的数据存储在df中,目标列名为'mixed_column' df['only_numbers'] = df['mixed_column'].str.extract(r'(\d+)', expand=False) # 可选:将提取出的字符串转为数值类型 df['only_numbers'] = pd.to_numeric(df['only_numbers'], errors='coerce')
str.extract(r'(\d+)')会匹配字段中连续的数字序列,返回第一个匹配结果。如果需要提取所有分散的数字(比如X1Y2Z3要得到123),可以用替换法删掉非数字字符:
df['all_numbers'] = df['mixed_column'].str.replace(r'\D', '', regex=True)
如果是处理单个字符串(不用pandas),用列表推导式也很直观:
def extract_all_digits(s): return ''.join(char for char in s if char.isdigit()) # 示例 print(extract_all_digits('A23B45')) # 输出 '2345'
问题2:处理CSV中的Cabin列(保留字母、替换NOCABIN为0)
看了你写的部分代码,先修正两个小问题:一是判断条件里应该用==而非=(你写成了赋值操作);二是dataset['Cabin'] < 'B'的逻辑不适用,我们需要提取所有字母部分,不管是A、B还是其他字母开头的值。
下面是完整的实现方案(基于pandas,适配你的CSV场景):
import pandas as pd # 读取CSV文件,假设full_set是包含DataFrame的列表(和你的代码结构一致) full_set = [pd.read_csv('your_file.csv')] for dataset in full_set: # 第一步:将NOCABIN替换为0 dataset['Cabin'] = dataset['Cabin'].replace('NOCABIN', 0) # 第二步:提取其他值中的字母部分 # 方法一:自定义函数+apply,逻辑清晰易读 def get_cabin_letters(value): if value == 0: return 0 # 转为字符串后提取所有字母字符 return ''.join([c for c in str(value) if c.isalpha()]) dataset['Cabin'] = dataset['Cabin'].apply(get_cabin_letters) # 方法二:用str.extract更高效(推荐处理大数据集) # 先转字符串,提取连续字母序列,空值(原0转字符串后无字母)填充为0 # dataset['Cabin'] = dataset['Cabin'].astype(str) # dataset['Cabin'] = dataset['Cabin'].str.extract(r'([A-Za-z]+)', expand=False) # dataset['Cabin'] = dataset['Cabin'].fillna(0)
两种方法的处理效果一致,比如:
| 原始Cabin值 | 处理后的值 |
|---|---|
| A | A |
| B34 | B |
| NOCABIN | 0 |
| C123D | CD |
方法一适合新手理解,方法二利用pandas内置字符串方法,处理大文件时效率更高。
内容的提问来源于stack exchange,提问作者panos hatzidakis
相关产品推荐
相关产品推荐

