如何用Python函数结合条件逻辑为Pandas生成两列数据?
问题解答
当然可以通过单个函数配合一次apply操作,同时为DataFrame生成多个新列,你的核心思路完全可行,只需修正现有代码中的几个细节问题即可实现预期效果。
现有代码的问题点
- 列名不匹配:DataFrame定义的列是
subclass,但函数中误写为sub_class,会触发KeyError - 大小写不匹配:数据中
class的取值是小写lime,但函数判断条件写的是大写'Lime',导致该分支永远不会触发 - 部分条件在当前数据集下不会触发(比如
subclass == 'orange'、class == 'Apple'),但不影响整体逻辑
修正后的完整代码
import pandas as pd list_of_classes =[ ['cit','lemon'], ['cit','lemon'], ['cit','lemon'], ['cit','lemon'], ['watermelon','lemon'], ['watermelon','lemon'], ['lime','water'], ['lime','water'] ] df = pd.DataFrame(list_of_classes,columns = ['class','subclass']) def create_variables(row): # 修正大小写匹配问题,列名修正为subclass if row['class'] == 'lime': val = 'Lime' val2 = 1 elif row['subclass'] == 'lemon': val = 'lemon' val2 = 1.1 elif row['subclass'] == 'orange': val = 'orange' val2 = 1.2 elif row['class'] == 'Apple': val = 'Apple' val2 = 2 else: val = 'exception' val2 = 'exception' return val, val2 # 一次apply生成两列 df[['fruit', 'number']] = df.apply(create_variables, axis=1) print(df)
运行结果
class subclass fruit number 0 cit lemon lemon 1.1 1 cit lemon lemon 1.1 2 cit lemon lemon 1.1 3 cit lemon lemon 1.1 4 watermelon lemon lemon 1.1 5 watermelon lemon lemon 1.1 6 lime water exception exception 7 lime water exception exception
补充说明
- 函数返回的二元组会被
apply自动处理为包含两个元素的序列,直接赋值给df[['fruit', 'number']]即可完成多列的一次性生成 - 如果需要生成更多列,只需在函数中返回对应长度的元组,同时扩展赋值的列名列表即可
内容的提问来源于stack exchange,提问作者Patty
相关产品推荐
相关产品推荐

