无法按条件拆分DataFrame列值:根据列A奇偶提取对应值
搞定Pandas按条件拆分列的需求
咱们先理清楚你要解决的问题,然后一步步修正你的代码:
你的输入数据
0 1 0 0 10,30 1 1 10,40 2 2 20,50
需求规则&期望结果
你提到的规则是:原第0列(A)能被2整除时取原第1列(B)的第一个值,否则取第二个值,但你的期望结果里A=1(不能被2整除)时C是10(B的第一个值),A=2(能被2整除)时C是50(B的第二个值)——看起来可能是规则写反了?我下面会给出两种版本的代码,你按需选择。
先看你想要的最终结果:
A B C 0 0 10,30 10 1 1 10,40 10 2 2 20,50 50
你的现有代码问题
你写的df['n'] = np.where(df[0] % 2 == 0, df[0], 0 )这一步完全没用到列拆分的逻辑,只是返回原列值或0,和需求不沾边;后面的str.s...没写完,核心的字符串拆分步骤没完成。
正确解决方案
版本1:匹配你给出的期望结果(规则实际是:A能被2整除取B的第二个值,否则取第一个)
import pandas as pd import numpy as np # 初始化数据,先把列名改成A、B,方便阅读 df = pd.DataFrame([(0, '10,30'), (1, '10,40'), (2, '20,50')], columns=['A', 'B']) # 把B列按逗号拆成两个整数列 df[['B_first', 'B_second']] = df['B'].str.split(',', expand=True).astype(int) # 按条件选值生成C列 df['C'] = np.where(df['A'] % 2 == 0, df['B_second'], df['B_first']) # 保留需要的列并调整顺序 df = df[['A', 'B', 'C']] print(df)
版本2:严格按照你写的规则(A能被2整除取B的第一个值,否则取第二个)
如果是规则没错,只是期望结果写错了,把np.where那行改成下面这样就行:
df['C'] = np.where(df['A'] % 2 == 0, df['B_first'], df['B_second'])
这时候输出的C列会是[10, 40, 20]。
代码解释
str.split(',', expand=True):把B列的字符串按逗号拆成两个独立的列,astype(int)把字符串转成整数,避免后续操作出现类型问题np.where(条件, 满足条件时取的值, 不满足时取的值):这是Pandas里做条件判断的高效方法,比apply快很多- 最后调整列顺序,得到你想要的结构
内容的提问来源于stack exchange,提问作者Abhis
相关产品推荐
相关产品推荐

