如何防止熊猫将我的整数值重新转换为浮点数?

And*_*ndy 3 python csv pandas

我正在合并两个带有以下输入的 CSV 文件。

文件1.csv

Id,attr1,attr2,attr3
1,True,7,"Purple"
2,False,19.8,"Cucumber"
3,False,-0.5,"A string with a comma, because it has one"
4,True,2,"Nope"
5,True,4.0,"Tuesday"
6,False,1,"Failure"
Run Code Online (Sandbox Code Playgroud)

文件2.csv

Id,attr4,attr5,attr6
2,"python",500000.12,False
5,"program",3,True
3,"Another string",-5,False
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时

import pandas as pd
df1 = pd.read_csv("file1.csv")
df2 = pd.read_csv("file2.csv")
merged = df1.merge(df2, on="Id", how="outer").fillna("")
merged.to_csv("merged.csv", index=False)
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出

Id,attr1,attr2,attr3,attr4,attr5,attr6
1,True,7.0,Purple,,,
2,False,19.8,Cucumber,python,500000.12,False
3,False,-0.5,"A string with a comma, because it has one",Another string,-5.0,False
4,True,2.0,Nope,,,
5,True,4.0,Tuesday,program,3.0,True
6,False,1.0,Failure,,,
Run Code Online (Sandbox Code Playgroud)

请注意,attr2我的一些记录已从 a 转换int为 a float

1,True,7.0,Purple,,,
Run Code Online (Sandbox Code Playgroud)

对比预期

1,True,7,Purple,,,
Run Code Online (Sandbox Code Playgroud)

对于这个示例数据集,这是一个小烦恼。但是,当我针对大量数据运行它时,我的Id列中也会出现这种行为。这将进一步打破我的工作流程链中的流程。

如何防止 Pandas 为整个文件或理想情况下为特定列执行此转换?

DSM*_*DSM 6

您可以将一个值(如果您想影响整个 DataFrame 或字典,如果您想影响单个列)传递给dtype参数:

>>> df = pd.read_csv("file1.csv", dtype={"id": int, "attr2": str})
>>> df
   id  attr1 attr2                                      attr3
0   1   True     7                                     Purple
1   2  False  19.8                                   Cucumber
2   3  False  -0.5  A string with a comma, because it has one
3   4   True     2                                       Nope
4   5   True   4.0                                    Tuesday
5   6  False     1                                    Failure

[6 rows x 4 columns]
>>> df.dtypes
id        int32
attr1      bool
attr2    object
attr3    object
dtype: object
Run Code Online (Sandbox Code Playgroud)