首页 > 解决方案 > 根据条件选择数据框列

问题描述

输入数据框:

    a   b  c    d   e    f    g       j   k  l    m    n    o    p    q   r      s  t
2  33  17  0  418  -5  -81  NaN   14336  81  1  462  -24  NaN   81    1   462  -24 NaN  
5  33  17  0  415  -5  -116 NaN   14336  81  0  487   -5  116   81    1   462  -24 NaN 
7  33  17  0  413  -5  -116 NaN   14336  81  1  462  -24  NaN   81    1   462  -24 -111 

检查列的值c是否等于0:将值插入d e fx1 x2 x3 检查列的值l是否等于0:将值插入m n oy1 y2 y3

如果他的列l值等于1:检查列ot:第一个包含值,插入m n o,或r s t进入列z1 z2 z3

输出数据框:

    x1  x2    x3    y1    y2    y3    z1   z2    z3
2  418  -5   -81   NaN   NaN   NaN   462  -24   NaN
5  415  -5  -116   487    -5   116   462  -24   NaN
7  413  -5   -81   NaN   NaN   NaN   462  -24  -111

标签: pythonpandasdataframe

解决方案


我认为需要where按条件过滤,concat将所有DataFrames 连接在一起并用另一个combine_first替换s :NaNDataFrame

df1 = df[['d','e','f']].where(df['c'].eq(0))
df1.columns = ['x1','x2','x3']

df2 = df[['m','n','o']].where(df['l'].eq(0))
df2.columns = ['y1','y2','y3']

df31 = df[['m','n','o']].where(df['l'].eq(1) & df['o'].notnull())
df31.columns = ['z1','z2','z3']

df32 = df[['r','s','t']].where(df['l'].eq(1) & df['t'].notnull())
df32.columns = ['z1','z2','z3']

df = pd.concat([df1, df2, df31.combine_first(df32)], axis=1)
print (df)
    x1  x2   x3     y1   y2     y3     z1    z2     z3
2  418  -5  -81    NaN  NaN    NaN    NaN   NaN    NaN
5  415  -5 -116  487.0 -5.0  116.0    NaN   NaN    NaN
7  413  -5 -116    NaN  NaN    NaN  462.0 -24.0 -111.0

推荐阅读