仅基于列中的非 NaN 值在数据框中创建新行

Posted

技术标签:

【中文标题】仅基于列中的非 NaN 值在数据框中创建新行【英文标题】:Create a new row in a dataframe based only for non NaN values from a column 【发布时间】: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")

【问题讨论】:

【参考方案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

以上是关于仅基于列中的非 NaN 值在数据框中创建新行的主要内容,如果未能解决你的问题,请参考以下文章

根据其他列中的值在 python 3 (pandas) 数据框中创建新列

删除数据框列中的非字母str

从熊猫列中的列表创建多列[重复]

如何将数据框中的值分配给在另一个数据框中创建的十分位数?

如何在 ggplot 中创建一个图例,将名称和颜色分配给列而不是数据框列中的值?

迭代循环并将列表添加到新行或新列中的数据框