【问题标题】:Create a new row in a dataframe based only for non NaN values from a column仅基于列中的非 NaN 值在数据框中创建新行
【发布时间】:2022-01-18 17:50:08
【问题描述】:

假设我有这样的数据框:

      col1       col2         col3
0     data1   Completed       Fail
1     data2   Completed       NaN
2     data3   Completed    Completed
3     data4   Completed       NaN
4     data5      NaN          NaN

如何每次 col3 中的值不是 NaN 并且具有这样的数据框时添加额外的行:

      col1     status           
0     data1   Completed 
1     data1      Fail
2     data2   Completed     
3     data3   Completed    
4     data3   Completed
5     data4   Completed      
6     data5      NaN        

我试过了,但没有得到理想的输出:

df  = df.melt(id_vars=['col1'],  
        value_name="status")

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    IIUC,您可以首先使用 pd.melt(),就像您已经使用的那样,但也可以通过链接 dropna() 来删除所有空值。这会让你接近,但不是你想去的地方:

    new = df.melt(id_vars='col1',value_name='status').sort_values(by='col1').dropna().drop('variable',axis=1)
    
    >>> print(new)
    
        col1     status
    0  data1  Completed
    5  data1       Fail
    1  data2  Completed
    2  data3  Completed
    7  data3  Completed
    3  data4  Completed
    

    此时,您需要将原始df 中的行带入col2 中的nan。您可以分别使用isnull()pd.concat() 来做到这一点:

    col2_nan = df.loc[df.col2.isnull()].drop('col3',axis=1).rename(columns = {'col2':'status'})
    
    >>> print(pd.concat([new,col2_nan]).reset_index(drop=True))
    
    
        col1     status
    0  data1  Completed
    1  data1       Fail
    2  data2  Completed
    3  data3  Completed
    4  data3  Completed
    5  data4  Completed
    6  data5        NaN
    

    【讨论】:

    • 非常感谢@sophocles
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多