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

时间:2018-11-24 17:27:19

标签: python-3.x pandas fillna

我有一个具有两个dtype的数据框:对象(原为字符串)和日期时间(预期日期时间)。我不了解这种行为以及它为什么影响我的fillna()。

enter image description here

使用inplace = True调用.fillna()会擦除表示为int64的数据,尽管已通过.astype(str)进行了更改

enter image description here

不带它调用.fillna()不会执行任何操作。

enter image description here

我知道pandas / numpy dtypes与python native不同,但这是正确的行为还是我遇到了严重错误?

样本:

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')

此处既不显示“ NULL”也不显示“ nan”。添加了.replace('nan','NULL'),但仍然没有。请给我一个提示,寻找什么?非常感谢。

enter image description here

1 个答案:

答案 0 :(得分:1)

这里的问题是将缺少的值转换为string,因此fillna无法正常工作。解决方法是使用pandas函数Series.str.stripSeries.str.lower很好地处理缺失值:

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