【问题标题】:Fill NaN with the longest length column's values in Python用 Python 中最长列的值填充 NaN
【发布时间】:2020-02-13 14:25:23
【问题描述】:

我想用最长的长度(从左侧按位置)填充 v5 列的 NaN,而不是 NaN 列的值。

     v1   v2   v3    v4     v5
0     a   ab  abc  abcd  abcde
1  abcd  abc   ab   NaN    NaN
2     a  abc   ac   cde    NaN
3   cde    c  NaN    cd    NaN

例如v5的第二行,其Not NaN列的最长长度为v1,则取abcd。如果存在多个长度相同的值,则最左边的值优先,例如第三行,我们将abc作为v5的值,而不是cde

在 Pandas 中可以做到这一点吗?谢谢。

预期的输出是这样的:

     v1   v2   v3    v4     v5
0     a   ab  abc  abcd  abcde
1  abcd  abc   ab   NaN   abcd
2     a  abc   ac   cde    abc
3   cde    c  NaN    cd    cde

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    想法是用DataFrame.applySeries.str.len测试所有值的长度,然后用DataFrame.where用没有最大行的缺失值替换行,回填缺失值,最后按位置获取第一列:

    df1 = df.apply(lambda x: x.str.len())
    
    df['v5'] = df.where(df1.eq(df1.max(axis=1), axis=0)).bfill(axis=1).iloc[:, 0]
    print (df)
         v1   v2   v3    v4     v5
    0     a   ab  abc  abcd  abcde
    1  abcd  abc   ab   NaN   abcd
    2     a  abc   ac   cde    abc
    3   cde    c  NaN    cd    cde
    

    【讨论】:

    • 谢谢,如果最右边的值有优先权,我应该在你的代码中修改什么?
    • @ahbon - 然后使用df['v5'] = df.where(df1.eq(df1.max(axis=1), axis=0)).ffill(axis=1).iloc[:, -1]
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多