【问题标题】:Replace NaN values with specific text based on adjacent column in pandas dataframe根据 pandas 数据框中的相邻列将 NaN 值替换为特定文本
【发布时间】:2021-06-09 00:48:18
【问题描述】:

我的数据在其第一列中有一些 NaN 值。要替换这些 NaN 值,我想查看下一列中的相邻值并将特定值作为 replaceNaN。这是csv数据:

,Release,SubRelease,ReleaseDate,TypeofRelease,Package
0,LTE,TL101,2017-09-27,Major Update,2.0.4
1,LTE,TL101,2017-09-26,Normal Update,3.1
2,NaN,TL209,2017-09-25,Major Update,3.2
3,5G,5GS,2017-09-25,Delivery,1.1
4,NaN,5GM,2017-09-24,Release,1.0
5,LTE,FL18A,2017-09-23,Normal Update,3.0

例如,Release 的第三行中有一个 NaN 值。我想查看同一行的SubRelease 列,并说由于这里的值是“TL209”,所以我想将NaN 替换为值“LTE”。同样,如果SubRelease 列中的值为“5G19”,我想将Release 的NaN 替换为“5G”。

我首先想到的是使用正则表达式,指定查看SubRelease 列中的值是否包含或以文本“5G”开头。但我不知道如何实现这一点。或者有没有更好的方法?

更容易查看 csv 数据:

【问题讨论】:

    标签: python pandas dataframe csv nan


    【解决方案1】:

    你可以这样做:

    df["Release"] = df["Release"].fillna(df["SubRelease"])
    df
    >>>   Release SubRelease ReleaseDate  TypeofRelease Package
    0     LTE      TL101  2017-09-27   Major Update   2.0.4
    1     LTE      TL101  2017-09-26  Normal Update     3.1
    2   TL209      TL209  2017-09-25   Major Update     3.2
    3      5G        5GS  2017-09-25       Delivery     1.1
    4     5GM        5GM  2017-09-24        Release     1.0
    5     LTE      FL18A  2017-09-23  Normal Update     3.0
    

    编辑我看错了问题,所以忘记了最后一步:

    df = df.replace({"Release":{"TL209":"LTE", "5GM":"5G", "5GS":"5G", ...}})
    >>>   Release SubRelease ReleaseDate  TypeofRelease Package
    0     LTE      TL101  2017-09-27   Major Update   2.0.4
    1     LTE      TL101  2017-09-26  Normal Update     3.1
    2     LTE      TL209  2017-09-25   Major Update     3.2
    3      5G        5GS  2017-09-25       Delivery     1.1
    4      5G        5GM  2017-09-24        Release     1.0
    5     LTE      FL18A  2017-09-23  Normal Update     3.0
    

    【讨论】:

    • 这不会给出想要的输出。如问题所述,Release 列的值应为“5G”或“LTE”,而不是“5GM”/“TL209”。
    【解决方案2】:

    要根据SubRelease 中的值替换Release 列中的所有NaN,您可以找到例如所有“5G”子版本并首先替换这些 NaN。如果有更多的条件,这些可以以相同的方式替换。最后,将所有剩余的 NaN 替换为默认值(此处为“LTE”)。

    这可以使用loc 和适当的掩码来完成:

    df.loc[df['Release'].isna() & df['SubRelease'].str.contains('5G'), 'Release'] = '5G'
    df = df.fillna('LTE')
    

    结果:

      Release SubRelease ReleaseDate  TypeofRelease Package
    0     LTE      TL101  2017-09-27   Major Update   2.0.4
    1     LTE      TL101  2017-09-26  Normal Update     3.1
    2     LTE      TL209  2017-09-25   Major Update     3.2
    3      5G        5GS  2017-09-25       Delivery     1.1
    4      5G        5GM  2017-09-24        Release     1.0
    5     LTE      FL18A  2017-09-23  Normal Update     3.0
    

    【讨论】:

    • 谢谢!这就说得通了。但是,如果我还想考虑 NaN 列中的空格怎么办?例如。我已经这样描述了 na_values: source = pd.read_csv(r'data.csv', delimiter=";", error_bad_lines=False, na_values=['', '', '', ' ', '*', '****'])
    • @sleepyPanda:要替换除 NaN 之外的其他实例(例如空格),您只需调整 df['Release'].isna() 条件即可。例如,要考虑空格和 NaN,您可以使用 cond = (df['Release'].isna()) | (df['Release'].str.strip() == ''),然后将其合并到上面的代码中,如下所示:df.loc[cond & df['SubRelease'].str.contains('5G'), ...
    猜你喜欢
    • 2021-09-07
    • 2020-04-14
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多