【问题标题】:Conditional selection of values from other column有条件地从其他列中选择值
【发布时间】:2020-08-31 18:56:04
【问题描述】:

继续我的previous question

我的数据集中有些行很乱

Serial     Val1      Val2      Val3      
1          21.10     NaN       13.51     
1          43.06     NaN       20.51     
1          32.12     NaN       NaN       
2          NaN       11.20     NaN       
2          NaN       NaN       NaN       
3          45.10     NaN       NaN       
3          14.16     NaN       NaN      
4          NaN       34.90     NaN       
4          NaN       12.12     11.10     
4          NaN       18.09     NaN       

这些是根据其唯一的序列号进行分组的。例如,序列 1 具有 Val1 和 Val3 的值,但我仍然更愿意为 ['All'] 列从 Val1 中选择值。在选择为 ['All'] 选择哪些 Val 列时,如果 Val1 可用,则 Val1 如果 Val1 不可用,则为 Val2...(Val1>Val2>Val3)

Serial     Val1      Val2      Val3      All       Source
1          21.10     NaN       13.51     21.10     Val1
1          43.06     NaN       20.51     43.06
1          32.12     NaN       NaN       32.12
2          NaN       11.20     NaN       11.20     Val2
2          NaN       NaN       NaN       NaN  
3          45.10     NaN       NaN       45.10     Val1
3          14.16     NaN       NaN       14.16
4          NaN       34.90     NaN       34.90     Val2
4          NaN       12.12     11.10     12.12    
4          NaN       18.09     NaN       18.09     

谢谢

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以先用DataFrame.iloc 回填缺失值并按位置查找第一个值,然后再使用与以前相同的解决方案:

    df1 = df[['Val1','Val2','Val3']]
    
    mask = df1.isna().all(axis=1)
    mask1 = df['Serial'].duplicated()
    
    df = (df.assign(All = df1.bfill(axis=1).iloc[:, 0],
                    Source = df1.notna().idxmax(axis=1).mask(mask1 | mask)))
    print (df)
       Serial   Val1   Val2   Val3    All Source
    0       1  21.10    NaN  13.51  21.10   Val1
    1       1  43.06    NaN  20.51  43.06    NaN
    2       1  32.12    NaN    NaN  32.12    NaN
    3       2    NaN  11.20    NaN  11.20   Val2
    4       2    NaN    NaN    NaN    NaN    NaN
    5       3  45.10    NaN    NaN  45.10   Val1
    6       3  14.16    NaN    NaN  14.16    NaN
    7       4    NaN  34.90    NaN  34.90   Val2
    8       4    NaN  12.12  11.10  12.12    NaN
    9       4    NaN  18.09    NaN  18.09    NaN
    

    【讨论】:

    • 谢谢。我检查过,是的,它选择了 Val1 值,但是当序列 2 中的行时,它不选择 Val2 值而是返回 NaN 值?
    • @kiyaserin - 不明白,你能解释更多吗?
    • 抱歉,之前的序列号错误。例如,在第 2 行中,它应该返回 Val2 值,因为 Val1 为空。但是当我尝试它返回一个 NaN 值?
    • @kiyaserin - 不明白,是否可以更改数据以查看它?
    猜你喜欢
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2020-09-08
    相关资源
    最近更新 更多