Python 使用reduce选项在空数据帧上调用apply会更改数据类型

Python 使用reduce选项在空数据帧上调用apply会更改数据类型,python,pandas,dataframe,Python,Pandas,Dataframe,我知道即使对于空数据帧,也会调用apply方法。当apply方法内部出现错误时,它不会被传播。我正在查看这个stackoverflow链接,它建议使用reduce选项,以便不调用apply函数。 考虑这个例子,在Col1中,所有值都小于10。因此,数据帧是空的。当我使用reduce选项时,col2的数据类型被更改。它将数字转换为小数 d = {'col1': [1, 2], 'col2': [3, 4]} df = pd.DataFrame(data=d) mask =

我知道即使对于空数据帧,也会调用apply方法。当apply方法内部出现错误时,它不会被传播。我正在查看这个stackoverflow链接,它建议使用
reduce
选项,以便不调用apply函数。

考虑这个例子,在Col1中,所有值都小于10。因此,数据帧是空的。当我使用reduce选项时,col2的数据类型被更改。它将数字转换为小数

    d = {'col1': [1, 2], 'col2': [3, 4]}
    df = pd.DataFrame(data=d)
    mask = df["col1"] > 10
    df.loc[mask, "col2"] = df[mask].apply(lambda x: x+2, axis=1, result_type='reduce')
    print(df)
预期产量

      col1    col2
   0    1       3
   1    2       4
实际产量:

      col1    col2
   0    1      3.0
   1    2      4.0

我不知道为什么它会把整数转换成小数。有人知道如何避免这种情况吗?

您可以使用
pd.to\u numeric()
向下转换为整数

如果我找到更好的方法,我会更新这个


若要避免浮点转换,请使用
df[mask].apply(lambda x:x+2,axis=1,result\u type='reduce').astype(int)
若要了解发生浮点的原因,请执行
axis=0
,您将看到具有type
float64
NaN
的介绍。以类似的方式,当您执行
axis=1
时,输出中没有行,但类型已转换为
float64
简单地
df.loc[mask,“col2”]=df[mask].apply(lambda x:x+2,axis=1,result\u type='reduce')。astype(int)
应执行此任务感谢@meW提供详细解释。
>>> import pandas as pd
>>> d = {'col1': [1, 2], 'col2': [3, 4]}
>>> df = pd.DataFrame(data=d)
>>> mask = df["col1"] > 10
>>> df.loc[mask, "col2"] = df[mask].apply(lambda x: x+2, axis=1, result_type='reduce')
>>>
>>> df
   col1  col2
0     1   3.0
1     2   4.0
>>>
>>> pd.to_numeric(df.col2, downcast='integer')
0    3
1    4
Name: col2, dtype: int8
>>>
>>> df.col2 = pd.to_numeric(df.col2, downcast='integer')
>>> df
   col1  col2
0     1     3
1     2     4
>>>