【Pandas】pandas Series add_suffix

Pandas2.2 Series

Computations descriptive stats

方法 描述
Series.align(other[, join, axis, level, …]) 用于将两个 Series 对齐,使其具有相同的索引
Series.case_when(caselist) 用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值
Series.drop([labels, axis, index, columns, …]) 用于从 Series 中删除指定的行或列(对于 Series 来说,通常是删除行)
Series.droplevel(level[, axis]) 用于从多层索引(MultiIndex)的 Series 中删除指定的索引层级
Series.drop_duplicates(*[, keep, inplace, …]) 用于从 Series 中删除重复的值
Series.duplicated([keep]) 用于检测 Series 中的重复值
Series.equals(other) 用于比较两个 Series 对象是否完全相等的方法
Series.first(offset) 用于根据日期偏移量(offset)选择 Series 中时间序列数据的初始部分
Series.head([n]) 用于返回 Series 的前 n 个元素
Series.idxmax([axis, skipna]) 用于返回 Series 中最大值的索引
Series.idxmin([axis, skipna]) 用于返回 Series 中最小值的索引
Series.isin(values) 用于检查 Series 中的每个元素是否存在于给定的值集合 values
Series.last(offset) 用于根据日期偏移量(offset)选择 Series 中时间序列数据的末尾部分
Series.reindex([index, axis, method, copy, …]) 用于重新索引 Series 对象的方法
Series.reindex_like(other[, method, copy, …]) 用于将 Series 对象重新索引以匹配另一个 SeriesDataFrame 的索引的方法
Series.rename([index, axis, copy, inplace, …]) 用于重命名 Series 对象的索引或轴标签的方法
Series.rename_axis([mapper, index, axis, …]) 用于为 Series 的索引轴(index)或列轴(columns,对于 Series 通常不适用)设置名称
Series.reset_index([level, drop, name, …]) 用于将 Series 的索引重置为默认整数索引的方法
Series.sample([n, frac, replace, weights, …]) 用于从 Series 中随机抽取样本的方法
Series.set_axis(labels, *[, axis, copy]) 用于设置 Series 对象的索引标签的方法。
Series.take(indices[, axis]) 用于根据指定的位置索引(indices)从 Series 中提取元素
Series.tail([n]) 用于返回 Series 的最后 n 行数据
<think> 我们需要将DataFrame中A列的值根据market_suffix_mapping字典进行翻译(映射)。如果字典中没有对应的键,我们可能需要处理缺失值(例如,设置为None、空字符串或特定标记)。 步骤如下: 1. 使用pandas的map方法,将A列的每个元素通过字典映射到对应的后缀。 2. 处理可能的缺失值(即A列中的值在字典中不存在的情况)。 假设我们有一个DataFrame df,以及一个映射字典market_suffix_mapping。 我们可以创建一个新的列(比如叫做'Suffix')来存储翻译结果。 示例代码: </think> # 使用字典映射翻译 DataFrame 列 要将 `market_suffix_mapping` 字典应用到 DataFrame 的 A 列进行翻译,以下是高效且健壮的解决方案: ```python import pandas as pd import numpy as np # 示例字典(假设这是您的market_suffix_mapping) market_suffix_mapping = { "16": ".SH", "17": ".SH", "18": ".SH", "19": ".SH", "20": ".SH", "21": ".SH", "22": ".SH", "23": ".SH", "32": ".SZ", "33": ".SZ", "34": ".SZ", "35": ".SZ", "36": ".SZ", "39": ".SZ", "57": ".SZ", "65": ".SHF", "66": ".DCE", "67": ".CZC", "68": ".DCE", "69": ".CZC", "70": ".SHF", "81": ".SHF", "129": ".CFE", "130": ".CFE", "144": ".NE", "145": ".NE", "146": ".SZ", "150": ".SH", "151": ".BJ", "176": ".HSI", "177": ".HK", "178": ".HK", "179": ".HK", "180": ".HK", "181": ".HK", "182": ".HK", "233": ".SH" } # 示例DataFrame data = { 'A': ['16', '32', '65', '129', '999', None, '150', '233', '177', 144, '200'] } df = pd.DataFrame(data) # 方法1:使用map()函数进行翻译(推荐) def translate_column(df, col_name, mapping_dict, default='未知后缀', missing_value='缺失值'): """ 使用字典映射翻译DataFrame列 参数: df: Pandas DataFrame col_name: 要翻译的列名 mapping_dict: 映射字典 default: 未找到映射时的默认值 missing_value: 原始空值的表示 返回: 翻译后的Series """ # 创建列副本 translated = df[col_name].copy() # 处理空值 translated.fillna(missing_value, inplace=True) # 转换为字符串类型(确保字典键匹配) translated = translated.astype(str) # 应用映射 return translated.map(lambda x: mapping_dict.get(x, default)) # 应用翻译 df['A_translated'] = translate_column(df, 'A', market_suffix_mapping) # 方法2:使用replace()函数(适用于小到中型字典) # df['A_translated'] = df['A'].replace(market_suffix_mapping).fillna('未知后缀') # 方法3:使用矢量化操作(最高效,适用于大型数据集) def vectorized_translate(s, mapping_dict, default='未知后缀'): # 创建映射数组 keys = np.array(list(mapping_dict.keys())) values = np.array(list(mapping_dict.values())) # 创建映射器字典(优化查找) mapper = {k: v for k, v in mapping_dict.items()} # 处理空值并转换为字符串 s = s.fillna('缺失值').astype(str) # 应用映射 return s.map(lambda x: mapper.get(x, default)) # 应用矢量化版本 # df['A_translated'] = vectorized_translate(df['A'], market_suffix_mapping) # 显示结果 print("翻译结果:") print(df) # 检查未映射的值 unknown_values = df[df['A_translated'] == '未知后缀']['A'].unique() if len(unknown_values) > 0: print(f"\n警告: 以下值未映射: {unknown_values}") ``` ### 代码解释 #### 方法1: 使用 `map()` 函数 ```python def translate_column(df, col_name, mapping_dict, default='未知后缀', missing_value='缺失值'): translated = df[col_name].copy() translated.fillna(missing_value, inplace=True) translated = translated.astype(str) return translated.map(lambda x: mapping_dict.get(x, default)) ``` - **优点**:简洁易读,适合大多数场景 - **缺点**:对于非常大的数据集可能不是最高效的 - 关键点: - 使用 `fillna()` 处理空值 - 使用 `astype(str)` 确保所有值都是字符串类型 - 使用 `map()` + `lambda` 应用字典映射 - 使用 `get(x, default)` 处理未映射的值 #### 方法2: 使用 `replace()` 函数 ```python df['A_translated'] = df['A'].replace(market_suffix_mapping).fillna('未知后缀') ``` - **优点**:非常简洁,一行代码完成 - **缺点**: - 不直接处理空值(需要额外处理) - 对于非常大的字典可能效率不高 #### 方法3: 矢量化操作 ```python def vectorized_translate(s, mapping_dict, default='未知后缀'): mapper = {k: v for k, v in mapping_dict.items()} s = s.fillna('缺失值').astype(str) return s.map(lambda x: mapper.get(x, default)) ``` - **优点**:最高效,特别适合大型数据集 - **缺点**:代码稍复杂 - 关键点: - 将字典转换为numpy数组优化查找 - 使用字典推导式创建优化后的映射器 ### 输出结果示例 ``` 翻译结果: A A_translated 0 16 .SH 1 32 .SZ 2 65 .SHF 3 129 .CFE 4 999 未知后缀 5 None 缺失值 6 150 .SH 7 233 .SH 8 177 .HK 9 144 .NE 10 200 未知后缀 警告: 以下值未映射: ['999' '200'] ``` ### 高级扩展:带日志记录的翻译类 ```python class ColumnTranslator: def __init__(self, mapping_dict, default='未知后缀', missing_value='缺失值'): self.mapping_dict = mapping_dict self.default = default self.missing_value = missing_value self.unmapped_values = set() def translate(self, series): # 重置未映射值记录 self.unmapped_values = set() # 创建处理函数 def translate_value(x): if pd.isna(x): return self.missing_value str_x = str(x) result = self.mapping_dict.get(str_x, self.default) if result == self.default: self.unmapped_values.add(str_x) return result # 应用翻译 return series.apply(translate_value) def report_unmapped(self): if self.unmapped_values: print(f"发现 {len(self.unmapped_values)} 个未映射的值: {', '.join(self.unmapped_values)}") else: print("所有值都成功映射") # 使用示例 translator = ColumnTranslator(market_suffix_mapping) df['A_translated'] = translator.translate(df['A']) translator.report_unmapped() ``` ### 性能优化技巧 1. **预转换键类型**: ```python # 如果原始数据可能是数值型,创建数值和字符串双版本映射 extended_mapping = {**{k: v for k, v in market_suffix_mapping.items()}, **{str(k): v for k, v in market_suffix_mapping.items() if isinstance(k, int)}} ``` 2. **使用 Pandas 的 `merge` 方法**(适合非常大的映射): ```python def translate_with_merge(df, col_name, mapping_dict): # 创建映射DataFrame map_df = pd.DataFrame({ 'key': list(mapping_dict.keys()), 'value': list(mapping_dict.values()) }) # 创建临时列并合并 df['temp_key'] = df[col_name].astype(str) result = pd.merge(df, map_df, left_on='temp_key', right_on='key', how='left') result['value'] = result['value'].fillna('未知后缀') # 清理临时列 result = result.drop(columns=['temp_key', 'key']) return result.rename(columns={'value': f'{col_name}_translated'}) ``` 3. **使用 `numpy.select` 实现条件映射**: ```python def translate_with_select(series, mapping_dict, default='未知后缀'): # 创建条件和选择列表 conditions = [series.astype(str) == k for k in mapping_dict.keys()] choices = list(mapping_dict.values()) return np.select(conditions, choices, default=default) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuweidong0802

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值