首页 > 解决方案 > 如何将值添加到缺失值 i

问题描述

我有一个数据框,

    Software Product    Case Number Num of days
    MDM9607.LE.1.0          2774904     -19.13888889
    MDM9607.LE.1.0          2774203     -19.60069444
    MDM9607.LE.1.0          2768088       -24.81597222
    MDM9607.LE.1.0          2767500       -25.0125
    MDM9607.LE.1.0          2764617        -26.67916667
    MDM9607.LE.1.0          2766991      -25.17430556
    MDM9607.LE.1.0          2765696
    MDM9607.LE.1.0          2764204
    MDM9607.LE.1.0         2764199
    MDM9607.LE.1.0         2774434           365
    MDM9607.LE.1.0         2769029           377
    MDM9607.LE.1.0         2764195           380
    MDM9607.LE.1.0        2763721             25
    MDM9607.LE.1.0        2770456             380
    MDM9607.LE.1.0       2768423


所需的输出条件:

    If:
        f9['Num of days'] > 365 than print L
        f9['Num of days'] < 365 than print N
        f9['Num of days'] == NaN than print U

代码:

    import pandas as pd
    import numpy as np

    df1 = pd.read_excel(r"Rawreport_2017.xlsx")
    df2 = pd.read_excel(r"Sampleswpl.xlsx")
    f9 = pd.merge(df1, df2, on=['Software Product'], how='outer')
    f9.to_excel(r"merge_new_1.xlsx")
    f9['Num of days'] = f9['Date/Time Opened'] - f9['CSDate']
    f9['Num of days_u']=f9['Num of days'].fillna('u')
    f9['status'] = np.where(f9['Num of days'] > 365, 'L', 'NL','u')
    f9.to_excel(r"merge_status_5.xlsx")

我正在使用包含一些缺失值的 Dataframe,缺失值应该打印为 Unknown,但是如果列大于 365,那么它应该打印为“L”<365 应该打印为“N”,但我有一些逻辑,但是此缺失值也被视为 0(零)并打印为“N”。

预期的输出应该是

     Software Product   Case Number     Num of days    Status
    MDM9607.LE.1.0          2774904     -19.13888889        N
    MDM9607.LE.1.0          2774203     -19.60069444        N
    MDM9607.LE.1.0          2768088       -24.81597222      N
    MDM9607.LE.1.0          2767500       -25.0125          N
    MDM9607.LE.1.0          2764617        -26.67916667     N
    MDM9607.LE.1.0          2766991      -25.17430556       N
    MDM9607.LE.1.0          2765696                         U
    MDM9607.LE.1.0          2764204                         U
    MDM9607.LE.1.0         2764199                          U
    MDM9607.LE.1.0         2774434           365            L
    MDM9607.LE.1.0         2769029           377            L
    MDM9607.LE.1.0         2764195           380            L
    MDM9607.LE.1.0        2763721             25            N
    MDM9607.LE.1.0        2770456             380           L

我使用了上面的,但我得到了:

TypeError: where() takes at most 3 arguments (4 given)

标签: python-3.xpandasnumpy

解决方案


使用numpy.select- 首先测试缺失值Series.isna,然后按条件,最后使用参数default

m1 = f9['Num of days'].isna()
m2 = f9['Num of days'] > 365

f9['Status'] = np.select([m1, m2], ['U','L'], default='N')

print (f9)
   Software Product  Case Number  Num of days Status
0    MDM9607.LE.1.0      2774904   -19.138889      N
1    MDM9607.LE.1.0      2774203   -19.600694      N
2    MDM9607.LE.1.0      2768088   -24.815972      N
3    MDM9607.LE.1.0      2767500   -25.012500      N
4    MDM9607.LE.1.0      2764617   -26.679167      N
5    MDM9607.LE.1.0      2766991   -25.174306      N
6    MDM9607.LE.1.0      2765696          NaN      U
7    MDM9607.LE.1.0      2764204          NaN      U
8    MDM9607.LE.1.0      2764199          NaN      U
9    MDM9607.LE.1.0      2774434   365.000000      N
10   MDM9607.LE.1.0      2769029   377.000000      L
11   MDM9607.LE.1.0      2764195   380.000000      L
12   MDM9607.LE.1.0      2763721    25.000000      N
13   MDM9607.LE.1.0      2770456   380.000000      L
14   MDM9607.LE.1.0      2768423          NaN      U

推荐阅读