仅从数据帧中的行中删除Nan值

2024-10-01 15:46:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,看起来像这样:

Df
lev1    lev2   lev3    lev4   lev5   description
RD21    Nan    Nan     Nan    Nan    Oil
Nan     RD32   Nan     Nan    Nan    Oil/Canola
Nan     Nan    RD33    Nan    Nan    Oil/Canola/Wheat
Nan     Nan    RD34    Nan    Nan    Oil/Canola/Flour
Nan     Nan    Nan     RD55   Nan    Oil/Canola/Flour/Thick
ED54    Nan    Nan     Nan    Nan    Rice
Nan     ED66   Nan     Nan    Nan    Rice/White
Nan     Nan    ED88    Nan    Nan    Rice/White/Jasmine
Nan     Nan    ED89    Nan    Nan    Rice/White/Basmati
Nan     ED68   Nan     Nan    Nan    Rice/Brown

我想删除所有NaN值,只保留非NaN值,如下所示:

DF2
code     description
RD21     Oil
RD32     Oil/Canola
RD33     Oil/Canola/Wheat
RD34     Oil/Canola/Flour
RD55     Oil/Canola/Flour/Thick
.
.
.

我该怎么做?我尝试使用notna()方法,但它返回dataframe的布尔值。任何帮助都将不胜感激


Tags: descriptionnanwhiteoilricewheatthickflour
3条回答

我们可以通过notna()来屏蔽

import pandas as pd
import numpy as np

df1 = pd.DataFrame(
    {
        'l1': [np.nan, 5],
        'l2': [6, np.nan],
        'd': ['a', 'b']
     }
)

notna = df1[['l1', 'l2']].notna().values
notna_values = df1[['l1', 'l2']].values[notna]
print(notna_values)

df2 = pd.DataFrame(df1['d'])
df2['code'] = notna_values

print(df2)

输出:

   d  code
0  a   6.0
1  b   5.0

您可以对df[cols](有问题列的子视图)中的每一行应用函数,删除每一行NaN,并只取剩下的一行

>>> cols = "lev1    lev2   lev3    lev4   lev5".split()
>>> df["code"] = df[cols].apply(lambda row: row.dropna().iloc[0])

如果不再需要原始列,也可以使用drop删除它们

>>> df.drop(columns=cols, inplace=True)

您可以像这样使用stack和groupby来查找第一个非空值

df['code'] = df[['lev1', 'lev2', 'lev3', 'lev4', 'lev5']].stack().groupby(level=0).first().reindex(df.index)

现在,您可以选择“代码”列和“说明”列

df[['code', 'description']]


   code             description
0  RD21                     Oil
1  RD32              Oil/Canola
2  RD33        Oil/Canola/Wheat
3  RD34        Oil/Canola/Flour
4  RD55  Oil/Canola/Flour/Thick
5  ED54                    Rice
6  ED66              Rice/White
7  ED88      Rice/White/Jasmine
8  ED89      Rice/White/Basmati
9  ED68              Rice/Brown

相关问题 更多 >

    热门问题