强制使用DataFrame类型并允许NaN

时间:2019-03-27 15:51:12

标签: python-3.x pandas dataframe

我需要使用某些数据类型初始化一个空的pandas DataFrame列,然后将一些行添加到DataFrame中,这些行可能不包含所有列,但是列的内容必须是在DataFrame时声明的内容。 有办法吗?

record_list = [
                   { 'lastname'    : 'Ford',
          'firstname'  : 'Ana',
          'agreed'     : 0
                   },
                   { 'lastname'    : 'Snow',
          'agreed'     : 'a'
                    }
                    ]
    df = pd.DataFrame({
    'lastname'    : np.array([], dtype=np.object),
        'firstname'   : np.array([], dtype=np.object),                       
            'agreed'      : np.array([], dtype=np.int64)
                    })

for record in record_list:
    df = df.append([record], ignore_index=True)

以上操作将失败,因为'agreed'是字符串,而不是int,但是如果它是int,则即使第二个记录的类型为str,也应在数据帧中放置一个NaN。 我也分别尝试了column和dtype,但是没有用。请帮忙!

2 个答案:

答案 0 :(得分:0)

目前尚不清楚您最终想要什么。但是我在解释我所理解的。将熊猫视为传统数据库。您不能将str和int放在同一列。但是默认情况下,在熊猫中,如果数据类型为int的列中有NaN,它将始终将数据显示为十进制Ex。 0.0最好先清除数据并插入新列表,然后直接读取到数据框。

new_data = []
for item in record_list:
    agrd = item.get("agreed", None)
    if isinstance(agrd, int):
        new_data.append(item)
    else:
        item["agreed"] = None
        new_data.append(item)

df = pd.DataFrame(new_data)

结果:

   agreed firstname lastname
0     0.0       Ana     Ford
1     NaN       NaN     Snow

因为有NaN个熊猫将始终显示小数而不是int。因此,您可以用df.<columnname>.fillna(value=-1)替换NaN,然后​​使用df["columnname"] = df.columnname.astype(int)

转换列

答案 1 :(得分:0)

一旦数据加载完毕,您就可以像下面那样使用pd.to_numeric()进行验证,并按自己的意愿对待它们:

df=df.append(record_list)
df.agreed=np.where(pd.to_numeric(df.agreed,errors='coerce').isna(),np.nan,df.agreed)
print(df)

  lastname firstname agreed
0     Ford       Ana      0
1     Snow       NaN    NaN