如何在DataFrame中为以数字开头的指定列字符串前置同行另一列字符串
解决DataFrame中选择性合并列的问题
先看看你的需求场景:
我有如下DataFrame(df):
col_1 col_2 col_3 col_4 sample_001 fjsah AB 11-110 sample_002 dfshb CD 20-210 sample_003 fsvhb EF N3-303 sample_004 dfbkk GH Q4-444 sample_005 gnddl IJ 55-005需要实现:仅当col_4中的字符串以数字开头时,将同行col_3中的字符串前置到该col_4字符串前,处理后得到目标DataFrame:
col_1 col_2 col_3 col_4 sample_001 fjsah AB AB11-110 sample_002 dfshb CD CD20-210 sample_003 fsvhb EF N3-303 sample_004 dfbkk GH Q4-444 sample_005 gnddl IJ IJ55-005我已经能通过以下代码识别出col_4中以数字开头的字符串:
for n in df['col_4']: if n[0].isdigit(): print(n)但不清楚如何在循环中实现这种「选择性合并」操作。
方法一:用apply函数(更简洁高效)
在pandas里处理行级逻辑,apply是很方便的选择,不用手动写复杂循环。直接对每行做判断,满足条件就拼接列值,否则保留原值:
import pandas as pd # 先构造你的DataFrame(如果已经有了可以跳过这部分) data = { 'col_1': ['sample_001', 'sample_002', 'sample_003', 'sample_004', 'sample_005'], 'col_2': ['fjsah', 'dfshb', 'fsvhb', 'dfbkk', 'gnddl'], 'col_3': ['AB', 'CD', 'EF', 'GH', 'IJ'], 'col_4': ['11-110', '20-210', 'N3-303', 'Q4-444', '55-005'] } df = pd.DataFrame(data) # 核心处理逻辑 df['col_4'] = df.apply( lambda row: row['col_3'] + row['col_4'] if row['col_4'][0].isdigit() else row['col_4'], axis=1 ) print(df)
这里axis=1指定按行处理,lambda函数里的逻辑完全匹配你的需求:检查col_4的首字符是不是数字,是就把col_3拼在前面,否则保持col_4不变。
方法二:修改你现有的循环逻辑
如果你想基于自己写的循环来实现,关键是要拿到行的索引,这样才能精准修改DataFrame里的对应值。原来的循环只遍历了col_4的数值,没有关联到具体行,所以没法修改数据。可以用iterrows()来遍历行和索引:
for idx, row in df.iterrows(): # 判断col_4首字符是否为数字 if row['col_4'][0].isdigit(): # 通过索引定位并修改该行的col_4值 df.loc[idx, 'col_4'] = row['col_3'] + row['col_4']
这样循环的时候,每一行的索引idx和行数据row都能拿到,满足条件时就用df.loc[idx, 'col_4']把拼接后的值赋值回去,就能实现你要的选择性合并了。
内容的提问来源于stack exchange,提问作者Bot75
相关产品推荐
相关产品推荐

