在索引和插入行时防止强制熊猫数据帧

Mik*_*e T 16 python coercion pandas

我正在处理熊猫数据帧的各个行,但是在索引和插入行时遇到强制问题。熊猫似乎总是想将int / float混合类型强制转换为全浮点类型,而且我看不到对此行为有任何明显的控制。

例如,这是一个带有aas intbas 的简单数据框float

import pandas as pd
pd.__version__  # '0.25.2'

df = pd.DataFrame({'a': [1], 'b': [2.2]})
print(df)
#    a    b
# 0  1  2.2
print(df.dtypes)
# a      int64
# b    float64
# dtype: object
Run Code Online (Sandbox Code Playgroud)

在索引一行时,这是一个强制问题:

print(df.loc[0])
# a    1.0
# b    2.2
# Name: 0, dtype: float64
print(dict(df.loc[0]))
# {'a': 1.0, 'b': 2.2}
Run Code Online (Sandbox Code Playgroud)

这是插入一行时的强制问题:

df.loc[1] = {'a': 5, 'b': 4.4}
print(df)
#      a    b
# 0  1.0  2.2
# 1  5.0  4.4
print(df.dtypes)
# a    float64
# b    float64
# dtype: object
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都希望a列保留为整数类型,而不是被强制转换为浮点类型。

Mik*_*e T 4

经过一番挖掘,这里有一些非常丑陋的解决方法。(更好的答案将被接受。)

这里发现的一个怪癖是非数字列停止强制转换,因此以下是如何将一行索引到 a dict

dict(df.assign(_='').loc[0].drop('_', axis=0))
# {'a': 1, 'b': 2.2}
Run Code Online (Sandbox Code Playgroud)

插入一行可以通过创建一个包含一行的新数据框来完成:

df = df.append(pd.DataFrame({'a': 5, 'b': 4.4}, index=[1]))
print(df)
#    a    b
# 0  1  2.2
# 1  5  4.4
Run Code Online (Sandbox Code Playgroud)

这两个技巧都没有针对大数据帧进行优化,所以我将非常感谢更好的答案!