首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在to_csv和read_csv之后获得一致的dtype?

如何在to_csv和read_csv之后获得一致的dtype?
EN

Stack Overflow用户
提问于 2019-07-10 16:49:02
回答 1查看 567关注 0票数 4

更新

托马什的回答解决了这个问题。然而,试图在我的实际问题中使用它会导致引用列名的问题、数据丢失时的问题等等。为了规避这一问题,我在评论中使用了CJR的建议,只是简单地选择了我的DataFrames。

下面的原始问题

我记忆中有一只熊猫的DataFrame。我希望能够将其写入文件(使用to_csv),然后使用read_csv将结果读入新的DataFrame。我希望原始DataFrame和新的"from DataFrame“具有相同的数据类型。

我试图通过为quotingread_csv使用quotecharto_csv参数来实现这一点。然而,这似乎不起作用。

我理解对于read_csvdtype参数可以用来强制数据类型,但这对我的用例来说并不实用(很多用于回归测试的自动生成的文件)。

下面是完整的例子。

tmp.py

代码语言:javascript
复制
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输出

代码语言:javascript
复制
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列:正如预期的那样,对于两个object,dtype都是DataFrames。
  2. 第2栏:意外行为。对于df1,dtype是object,而对于df2,dtype是float64
  3. 第3栏:预期行为。df1有dtype int64,而df2有dtype float64。正如csv模块所描述的,csv.QUOTE_NONNUMERIC“指示读取器将所有非引用字段转换为float类型。”

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

tmp.csv

代码语言:javascript
复制
0,1,2
"A","100",100
"B","200",200
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-10 17:11:15

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

使用带有int64**:**的原始数据集的

代码语言:javascript
复制
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())

结果:

代码语言:javascript
复制
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 值的:

代码语言:javascript
复制
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())

结果:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56975273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档