如何在Pandas DataFrame切片中用apply批量设置多列值
解决pandas中apply返回元组赋值多列的问题
嘿,我来帮你搞定这个问题!你遇到的情况是因为pandas对apply返回的元组处理逻辑导致的:直接把返回元组的Series赋值给多列时,它不会自动拆分元组到对应列,反而会把整个元组作为值塞进每个单元格,所以才会出现两列都变成元组的情况。下面给你两种靠谱的解决方法:
方法一:将apply结果转换为可拆分的格式
你可以把apply返回的结果转换成列表或者DataFrame,让pandas能自动匹配列进行赋值:
方式1:用tolist()转换
修改赋值代码为:
df.loc[df['Alt']==0, ['Alt', 'AltType']] = df.loc[df['Alt']==0].apply(testapply, axis=1).tolist()
tolist()会把每个元组转换成列表,pandas就能识别出这是对应两列的值,自动拆分赋值。
方式2:转换为DataFrame
也可以把apply的结果转换成DataFrame,这样列名和目标列对应后直接赋值:
# 把apply返回的元组转换成DataFrame,自动生成0、1列 result_df = df.loc[df['Alt']==0].apply(testapply, axis=1).apply(pd.Series) # 赋值给目标列 df.loc[df['Alt']==0, ['Alt', 'AltType']] = result_df
方法二:在apply函数内直接修改行数据
如果你更习惯在apply里直接操作行,可以修改函数逻辑,返回修改后的整行:
def testapply(row): # 只处理Alt为0的行 if row['Alt'] == 0: try: match = re.findall("SFC-([0-9]+)FT (MSL|AGL|FL)", row.FreeText)[0] row['Alt'] = int(match[0]) row['AltType'] = match[1] except IndexError: # 没匹配到的话保持原数据 pass return row # 对整个DataFrame应用函数 df = df.apply(testapply, axis=1)
这种方法不需要单独切片赋值,直接处理整行数据,逻辑更直观。
验证结果
执行完上面的任意一种方法后,你的DataFrame第三行数据会变成:
| Alt | AltType | FreeText |
|---|---|---|
| 10000 | MSL | xxxx SFC-10000ft MSLXXX |
完全符合你的预期!
内容的提问来源于stack exchange,提问作者crackernutter
相关产品推荐
相关产品推荐

