代码之家  ›  专栏  ›  技术社区  ›  Bartek Malysz

pandas.dataframe()混合数据类型和奇怪的.fillna()行为

  •  1
  • Bartek Malysz  · 技术社区  · 6 年前

    我有一个数据帧,它有两个数据类型:对象(需要字符串)和日期时间(需要日期时间)。我不理解这种行为以及它为什么会影响我的Fillna()。

    使用inplace=true调用.fillna()将擦除指示为int64的数据,尽管使用.astype(str)进行了更改

    调用.fillna()而不使用它则不起任何作用。

    我知道pandas/numpy数据类型与python本地的不同,但它是正确的行为还是我遇到了严重错误?

    样本:

    import random
    进口麻木
    sample=pd.dataframe('a':[random.choice(['aabb',np.nan,'bbcc','ccdd']),用于范围(15)中的x,
    ‘B’:范围(15)内x的[随机选择(['2019-11-30'、'2020-06-30'、'2018-12-31'、'2019-03-31'])
    sample.loc[:,'b']=pd.to_datetime(sample['b'])
    < /代码> 
    
    

    for col in sample.select_dtypes(include='object').columns.tolist():
    sample.loc[:,col].astype(str).apply(lambda x:str(x).strip().lower()).fillna('null')
    
    对于sample.columns中的col:
    打印(sample[col].value_counts().head(15))。
    打印('\n)
    < /代码> 
    
    

    这里既不显示“空”也不显示“nan”。已添加。替换(“nan”,“null”),但仍然为空。你能告诉我找什么吗?多谢。

    =

    enter image description here

    使用inplace=true调用.fillna()将擦除指示为int64的数据,尽管使用.astype(str)进行了更改。

    enter image description here

    不使用它调用.fillna()什么也不做。

    enter image description here

    我知道pandas/numpy数据类型与python本地的不同,但它是正确的行为还是我遇到了严重错误?

    样品:

    import random
    import numpy
    sample = pd.DataFrame({'A': [random.choice(['aabb',np.nan,'bbcc','ccdd']) for x in range(15)],
                           'B': [random.choice(['2019-11-30','2020-06-30','2018-12-31','2019-03-31']) for x in range(15)]})
    sample.loc[:, 'B'] = pd.to_datetime(sample['B'])
    

    enter image description here

    for col in sample.select_dtypes(include='object').columns.tolist():
        sample.loc[:, col].astype(str).apply(lambda x: str(x).strip().lower()).fillna('NULL')
    
    for col in sample.columns:
        print(sample[col].value_counts().head(15))
        print('\n')
    

    这里既不显示“空”也不显示“nan”。已添加。替换(“nan”,“null”),但仍然为空。你能告诉我找什么吗?多谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    这里的问题是将缺少的值转换为 string 所以 fillna 无法工作。解决方案是使用熊猫功能 Series.str.strip Series.str.lower 处理缺失值非常好:

    for col in sample.select_dtypes(include='object').columns:
        sample[col] = sample[col].str.strip().str.lower().fillna('NULL')