如何在DataFrame中逐行遍历并每次针对两列完成标记操作?
解决方案
直接上可运行的代码,完全匹配你的需求:
import pandas as pd cols_dict = {'matr': {0: '18I1', 1: '03I2', 2: '03I3', 3: '18I4', 4: '03I5', 5: '03I6', 6: '03I7', 7: '03I8', 8: '18I9', 9: '18I0'}, 'cat': {0: '3', 1: '3', 2: '3', 3: '3', 4: '3', 5: '18', 6: '3', 7: '3', 8: '3', 9: '3'}, 'Unnamed: 5': {0: 81, 1: 81, 2: 81, 3: 77, 4: None, 5: None, 6: 83, 7: 81, 8: 79, 9: 81}, 'Unnamed: 6': {0: 91, 1: 97, 2: 97, 3: 91, 4: None, 5: 93, 6: 89, 7: 83, 8: 81, 9: 99}, 'Unnamed: 7': {0: 117.0, 1: 115.0, 2: 115.0, 3: 115.0, 4: 115.0, 5: None, 6: 115.0, 7: 115.0, 8: 115.0, 9: 115.0}, 'Unnamed: 8': {0: 123.0, 1: 115.0, 2: 115.0, 3: 115.0, 4: 123.0, 5: 123.0, 6: 125.0, 7: 123.0, 8: 117.0, 9: None}} cols_df = pd.DataFrame.from_dict(cols_dict) # 提取需要检查的数值列(排除首列matr和分类列cat) target_cols = cols_df.columns[2:] # 初始化标记列xs cols_df['xs'] = None # 将目标列统一转换为数值类型,非数值内容转为NaN numeric_df = cols_df[target_cols].apply(pd.to_numeric, errors='coerce') # 标记所有存在非数值的行 cols_df.loc[numeric_df.isna().any(axis=1), 'xs'] = 'X' # 调整列顺序,匹配示例输出的结构 cols_out_df = cols_df[['matr', 'xs', 'cat'] + list(target_cols)] # 查看结果 print(cols_out_df.to_dict())
关键步骤说明
- 筛选目标列:我们只关注除
matr(首列)和cat之外的数值列,这些是需要检查的对象。 - 初始化标记列:先给
xs列全部赋值为None,后续仅对符合条件的行进行修改。 - 统一数值转换:用
pd.to_numeric把所有目标列转为数值格式,原有的None或无法转成数字的内容会变成NaN,便于统一判断。 - 标记非数值行:通过
isna().any(axis=1)找出任意目标列存在非数值的行,给这些行的xs列赋值为'X'。 - 调整列顺序:按照示例输出的列顺序重新排列DataFrame,确保
xs列紧跟在matr之后。
运行代码后,得到的cols_out_df与你提供的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Maya_Cent
相关产品推荐
相关产品推荐

