Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧对象类型在不同数据类型上填充异常_Python_Pandas - Fatal编程技术网

Python 数据帧对象类型在不同数据类型上填充异常

Python 数据帧对象类型在不同数据类型上填充异常,python,pandas,Python,Pandas,我有一个熊猫数据框,不同的列有不同的数据类型。例如,df.dtypes返回以下内容 Date datetime64[ns] FundID int64 FundName object CumPos int64 MTMPrice float64 PricingMechan

我有一个熊猫数据框,不同的列有不同的数据类型。例如,df.dtypes返回以下内容

Date                    datetime64[ns]
FundID                           int64
FundName                        object
CumPos                           int64
MTMPrice                       float64
PricingMechanism                object
许多cheese列中都缺少值。使用NaN值对其执行组操作会导致问题。显然,使用.fillna()方法来摆脱它们是一个不错的选择。问题是字符串的clouse是.fillna(“”),而.fillna(0)是int和float的正确选择。在DataFrame上使用任一方法都会引发异常。除了单独操作(大约有30列)之外,还有什么优雅的解决方案吗?根据数据帧,我有很多代码,我不希望重新键入列,因为这可能会破坏其他逻辑。 可以做:


您可以遍历它们并使用
if
语句

for col in df:
    #get dtype for column
    dt = df[col].dtype 
    #check if it is a number
    if dt == int or dt == float:
        df[col].fillna(0)
    else:
        df[col].fillna("")

当您迭代一个数据帧时,您将获得每个列的名称,因此要访问这些列,您可以使用
df[col]
。这样您就不需要手动执行,脚本只需遍历每一列并检查其数据类型

您可以使用以下方法获取float64和object列:

In [11]: float_cols = df.blocks['float64'].columns

In [12]: object_cols = df.blocks['object'].columns
int列将不会有nan,否则它们会有

现在,您可以采用一种厚颜无耻的方式应用相应的s:

In [13]: d1 = dict((col, '') for col in object_cols)

In [14]: d2 = dict((col, 0) for col in float_cols)

In [15]: df.fillna(value=dict(d1, **d2))

精简版示例:

#replace Nan with '' for columns of type 'object'
df=df.select_dtypes(include='object').fillna('') 

但是,在执行上述操作之后,数据帧将只包含“object”类型的列。要保留所有列,请使用@Ryan Saxe提出的解决方案。

@Ryan Saxe的答案是准确的。为了让它对我的数据起作用,我必须设置
inplace=True
以及
data=0
data=“”
。见下面的代码:

for col in df:
    #get dtype for column
    dt = df[col].dtype 
    #check if it is a number
    if dt == int or dt == float:
        df[col].fillna(data=0, inplace=True)
    else:
        df[col].fillna(data="", inplace=True)

与@Guddi类似:有点冗长,但比@Ryan的答案更简洁,保留所有专栏:

df[df.select_dtypes("object").columns] = df.select_dtypes("object").fillna("")

您需要
inplace=True
才能使用(或分配列)注意:尽管这是一个巧妙的技巧,但它是否是一个真正的“有效”语法仍存在一些争议:)请参见df.blocks是新版本0.11.0method@Joop值得升级,而不仅仅是块!:)
df[df.select_dtypes("object").columns] = df.select_dtypes("object").fillna("")