当我合并两个dataFrame时,如何防止Pandas将我的整数转换为浮点数?

qlckcl4x  于 2023-03-28  发布在  其他
关注(0)|答案(4)|浏览(202)

下面是我的代码:

import pandas as pd
left = pd.DataFrame({'AID': [1, 2, 3, 4],
                       'D': [2011, 2011,0, 2011],
                       'R1': [0, 1, 0, 0],
                       'R2': [1, 0, 0, 0]  })

right = pd.DataFrame({'AID': [1, 2, 3, 4],
                       'D': [2012, 0,0, 2012],
                       'R1': [0, 1, 0, 0],
                       'R2': [1, 0, 0, 0]  })

result = left.merge(right, how = 'outer')

当我打印结果dataFrame时,整数值现在是浮点数:

AID       D   R1   R2
0  1.0  2011.0  0.0  1.0
1  2.0  2011.0  1.0  0.0
2  3.0     0.0  0.0  0.0
3  4.0  2011.0  0.0  0.0
4  1.0  2012.0  0.0  1.0
5  2.0     0.0  1.0  0.0
6  4.0  2012.0  0.0  0.0

我该如何预防这种情况?

pu82cl6c

pu82cl6c1#

此错误已在pandas v0.19.0中修复。:
合并现在将保留联接键的dtype
但请注意,您可以使用以下命令将dataframe中的所有列转换为int dtype:

result = result.astype(int)

如果join中有不匹配的记录,那么这种行为 * 确实 * 仍然会发生,因此结果中有NaN s。在这种情况下,您需要将dtype更改为扩展类型'Int64'以处理NaN s:

result = result.astype('Int64')
6qfn3psc

6qfn3psc2#

你可以将浮点数强制转换回使用

result = left.merge(right, on='AID', how = 'outer')

 result['D_x']=result['D_x'].astype('Int64')
 result['R1_x']=result['R1_x'].astype('Int64')
 result['R2_x']=result['R2_x'].astype('Int64')
 result['D_y']=result['D_y'].astype('Int64')
 result['R1_y']=result['R1_y'].astype('Int64')
 result['R2_y']=result['R2_y'].astype('Int64')

如果数据为空或缺少数据

import numbers
import math

left = pd.DataFrame({'AID': [1, 2, 3, 4],
                   'D': [2011, 2011,0, 2011],
                   'R1': [0, 1, 0, 0],
                   'R2': [1, 0, 0, 0]  })

right = pd.DataFrame({'AID': [1, 2, 3, 4],
                   'D': [2012, 0,0, 2012],
                   'R1': [0, 1, 0, 0],
                   'R2': [1, 0, 0, 0]  })

result = left.merge(right, how = 'outer')
result['AID']=[int(val) if isinstance(val,numbers.Number) & (math.isnan(val)==False) else 0 for val in result['AID']]
result['D']=[int(val) if isinstance(val,numbers.Number) & (math.isnan(val)==False) else 0 for val in result['D']]
result['R1']=[int(val) if isinstance(val,numbers.Number) & (math.isnan(val)==False) else 0 for val in result['R1']]
result['R2']=[int(val) if isinstance(val,numbers.Number) & (math.isnan(val)==False) else 0 for val in result['R2']]

 print(result)
 print(result.isna())

输出

AID     D  R1  R2
0    1  2011   0   1
1    2  2011   1   0
2    3     0   0   0
3    4  2011   0   0
4    1  2012   0   1
5    2     0   1   0
6    4  2012   0   0

   AID      D     R1     R2
0  False  False  False  False
1  False  False  False  False
2  False  False  False  False
3  False  False  False  False
4  False  False  False  False
5  False  False  False  False
6  False  False  False  False

然后,您可以将nan值替换为:平均值、0或插值
固定色谱柱D

def interpolate_list(y):
    idx = np.nonzero(y)
    x = np.arange(len(y))
    interp = interp1d(x[idx],y[idx])
   new_values = interp(x)
   return new_values

interp_d=interpolate_list(np.array(result['D']))
data=list(zip(interp_d,result['D']))
result['D']=[item[0] if item[1]==0 else item[1] for item in data]
print(result)

输出

AID       D  R1  R2
0    1  2011.0   0   1
1    2  2011.0   1   0
2    3  2011.0   0   0
3    4  2011.0   0   0
4    1  2012.0   0   1
5    2  2012.0   1   0
6    4  2012.0   0   0
ltskdhd1

ltskdhd13#

我也遇到了同样的问题,这是因为在合并后,我在重新铸造的列中得到了一些NaN的值。
所以,我的“before”列是int32,我的“now”表是float64。
当我想把它转换成int32时,我遇到了这个问题:
“值错误:无法将非有限值(NA或inf)转换为整数”
所以我把它放在float64:D上

odopli94

odopli944#

不幸的是,按照iacob的建议使用int64对我没有帮助。我使用了type=object,它工作得很好。使用这种类型时,数学运算也是可能的。

相关问题