仅基于列中的非 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) 数据框中创建新列