gpt4 book ai didi

python - 如何在 to_csv 和 read_csv 之后获得一致的数据类型?

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:17 37 4
gpt4 key购买 nike

更新:

TomNash 的回答解决了问题。但是,尝试在我的实际问题中使用它会导致引用列名称的问题、缺少数据时的问题等。为了避免这种情况,我在评论中使用 CJR 的建议来简单地 pickle 我的 DataFrame。

下面是原始问题:

我的内存中有一个 Panda 的 DataFrame。我希望能够将其写入文件(使用 to_csv),然后使用 read_csv 将结果读入新的 DataFrame。我希望原始 DataFrame 和新的“来自文件 DataFrame”具有相同的数据类型。

我试图通过为 to_csvread_csv 使用 quotingquotechar 参数来实现它>。然而,这似乎并不能解决问题。

我知道对于 read_csv 而言,dtype 参数可用于强制数据类型,但这对我的用例来说并不实用(很多自动生成的文件用于回归测试)。

完整示例如下。

tmp.py:

import pandas as pd
from csv import QUOTE_NONNUMERIC
import sys

print('Python version information:')
print(sys.version)
print('Pandas version information:')
print(pd.__version__)

df1 = pd.DataFrame([['A', '100', 100], ['B', '200', 200]])
print('df1:')
print(df1.info())

df1.to_csv('tmp.csv', index=False, quoting=QUOTE_NONNUMERIC,
quotechar='"')

df2 = pd.read_csv('tmp.csv', quoting=QUOTE_NONNUMERIC, quotechar='"')
print('df2:')
print(df2.info())

运行 tmp.py 的输出:

Python version information:
3.7.3 (default, Jun 11 2019, 01:11:15)
[GCC 6.3.0 20170516]
Pandas version information:
0.24.2
df1:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
0 2 non-null object
1 2 non-null object
2 2 non-null int64
dtypes: int64(1), object(2)
memory usage: 128.0+ bytes
None
df2:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
0 2 non-null object
1 2 non-null float64
2 2 non-null float64
dtypes: float64(2), object(1)
memory usage: 128.0+ bytes
None
  1. 第 1 列:正如预期的那样,两个 DataFrame 的数据类型都是 object
  2. 第 2 列:意外行为。对于 df1,dtype 是 object,而对于 df2,dtype 是 float64
  3. 第 3 列:预期行为。 df1 的数据类型为 int64df2 的数据类型为 float64。作为csv module描述,csv.QUOTE_NONNUMERIC“指示读者将所有非引号字段转换为 float 类型。”

tmp.csv 的内容如下。请注意,第二列被引用,所以我希望 read_csv 给我一个对象。

tmp.csv:

0,1,2
"A","100",100
"B","200",200

最佳答案

尝试在读取时使用QUOTE_NONE,这会保留读/写之间的数据类型。

将原始数据集与 int64 结合使用:

import pandas as pd
from csv import QUOTE_NONNUMERIC, QUOTE_NONE
import sys

print('Python version information:')
print(sys.version)
print('Pandas version information:')
print(pd.__version__)

df1 = pd.DataFrame([['A', '100', 100], ['B', '200', 200]])
print('df1:')
print(df1.info())

df1.to_csv('tmp.csv', index=False, quoting=QUOTE_NONNUMERIC, quotechar='"')

df2 = pd.read_csv('tmp.csv', quoting=QUOTE_NONE).replace('"','', regex=True)
print('df2:')
print(df2.info())

结果:

Python version information:
3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)]
Pandas version information:
0.24.2
df1:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
0 2 non-null object
1 2 non-null object
2 2 non-null int64
dtypes: int64(1), object(2)
memory usage: 128.0+ bytes
None
df2:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
0 2 non-null object
1 2 non-null object
2 2 non-null int64
dtypes: int64(1), object(2)
memory usage: 128.0+ bytes
None

在输入中使用 float64 值:

import pandas as pd
from csv import QUOTE_NONNUMERIC, QUOTE_NONE, QUOTE_MINIMAL
import sys

print('Python version information:')
print(sys.version)
print('Pandas version information:')
print(pd.__version__)

df1 = pd.DataFrame([['A', '100', 100.1], ['B', '200', 200.2]])
print('df1:')
print(df1.info())

df1.to_csv('tmp.csv', index=False, quoting=QUOTE_NONNUMERIC, quotechar='"')

df2 = pd.read_csv('tmp.csv', quoting=QUOTE_NONE).replace('"','', regex=True)
print('df2:')
print(df2.info())

结果:

Python version information:
3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)]
Pandas version information:
0.24.2
df1:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
0 2 non-null object
1 2 non-null object
2 2 non-null float64
dtypes: float64(1), object(2)
memory usage: 128.0+ bytes
None
df2:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 3 columns):
0 2 non-null object
1 2 non-null object
2 2 non-null float64
dtypes: float64(1), object(2)
memory usage: 128.0+ bytes
None

关于python - 如何在 to_csv 和 read_csv 之后获得一致的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56975273/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com