【问题标题】:How to use pandas to fill missing data on specific categories of data within the dataframe?如何使用 pandas 填充数据框中特定类别数据的缺失数据?
【发布时间】:2018-05-16 07:15:06
【问题描述】:

如何使用 pandas 填补数据框中特定类别数据的缺失数据?

我在选择一个类别后使用了 fillna(method='ffill') ,但这会在其他类别上创建 NaN 值。有没有更好的办法?

我使用它,即我选择类别“Buurt”并应用填充(以插入缺少的邮政编码)。但是具有另一个类别('Wijk')的行将变为 NaN。

df['Zipcode'] = df.loc[(df['RegionType'] == 'Buurt'), 'Zipcode'].fillna(method='ffill')

df 前后:

           City                              Zipcode RegionType
Codering                                                   
BU06100305   Sliedrecht                     3362      Buurt
BU06100306   Sliedrecht                     3361      Buurt
BU06100307   Sliedrecht                     3361      Buurt
WK061004     Sliedrecht                        .       Wijk
BU06100401   Sliedrecht                      NaN      Buurt
BU06100402   Sliedrecht                      NaN      Buurt
BU06100403   Sliedrecht                     3364      Buurt
BU06100404   Sliedrecht                     3364      Buurt
BU06100405   Sliedrecht                     3364      Buurt
BU06100406   Sliedrecht                     3364      Buurt
           City                              Zipcode RegionType
Codering                                                   
BU06100305   Sliedrecht                     3362      Buurt
BU06100306   Sliedrecht                     3361      Buurt
BU06100307   Sliedrecht                     3361      Buurt
WK061004     Sliedrecht                      NaN       Wijk
BU06100401   Sliedrecht                     3361      Buurt
BU06100402   Sliedrecht                     3361      Buurt
BU06100403   Sliedrecht                     3364      Buurt
BU06100404   Sliedrecht                     3364      Buurt
BU06100405   Sliedrecht                     3364      Buurt
BU06100406   Sliedrecht                     3364      Buurt

我可以将 NaN 改回点 (.),但我觉得必须有更好的方法。特别是因为 'Buurt' 的行实际上是用一个点 (.) 填充的,而我首先将它们更改为 NaN 以执行 fillna(method='ffill')...

serieBuurtNoZipcode = (df['RegioType'] == 'Buurt') & (df['Zipcode'] == '.') 
df.loc[(serieBuurtNoZipcode), 'Zipcode'] = np.nan

我怎样才能以更聪明的方式做到这一点?非常感谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为您也需要分配给过滤列Zipcode

    mask = (df['RegionType'] == 'Buurt')
    df.loc[mask, 'Zipcode'] = df.loc[mask, 'Zipcode'].ffill()
    print (df)
                      City Zipcode RegionType
    Codering                                 
    BU06100305  Sliedrecht    3362      Buurt
    BU06100306  Sliedrecht    3361      Buurt
    BU06100307  Sliedrecht    3361      Buurt
    WK061004    Sliedrecht       .       Wijk
    BU06100401  Sliedrecht    3361      Buurt
    BU06100402  Sliedrecht    3361      Buurt
    BU06100403  Sliedrecht    3364      Buurt
    BU06100404  Sliedrecht    3364      Buurt
    BU06100405  Sliedrecht    3364      Buurt
    BU06100406  Sliedrecht    3364      Buurt
    

    但如果想用ffill 替换所有类别,请使用groupby

    df['Zipcode'] = df.groupby('RegionType')['Zipcode'].ffill()
    

    更笼统的:

    df['Zipcode'] = df.groupby('RegionType')['Zipcode'].apply(lambda x: x.ffill().bfill())
    

    【讨论】:

    • 非常感谢,它有效! -> 我还不得不在作业中戴上面具。而且 groupby / ffill() 也有效,太神奇了!我之前尝试过 ffill 但认为邮政编码必须是整数才能使用它。如果没有 groupby,我会得到“'float' 对象没有属性 'ffill'”。仅供参考我试过: df['Zipcode'] = df['Zipcode'].replace('.', '0').astype(int) & df.loc[(mask), 'Zipcode'] = df.loc [(掩码),'邮政编码'].apply(lambda x:x.ffill().bfill())。它使邮政编码看起来像“3362.0”并且不起作用。但是有了 groupby 就完美了,哇!只是真的想知道:为什么? :)
    • 不是 100% 肯定,但它似乎 int 保存为字符串,因为如果所有数字都得到浮点数(NaN 是浮点数,所以它也将所有值转换为浮点数。
    猜你喜欢
    • 2019-12-13
    • 2020-02-28
    • 2022-11-02
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多