我正在读取csv,并且我不希望将列的数据类型作为对象,它们应该是int,float,str等。
data = pd.read_csv(file_path+files, delimiter='\t', error_bad_lines=False)
data.dtypes:
Time object
Code int64
Address object
dtype: object
有什么办法可以使我们在读取时从csv中读取原始数据类型:
预期:
data.dtypes:
Time int
Code int64
Address str
我有一个看起来像这样的数据框:
df:
A B C
abc 10 20
def 30 50
cfg 90 60
pqr str 50
xyz 75 56
我想摆脱列“ B”不是“ int”的行。由于B的dtype被设置为“对象”,因此我无法这样做。
答案 0 :(得分:2)
您可以向dtype
提供read_csv()
kwarg。从文档中:
dtype:类型名称或列的字典->类型,默认为无
数据或列的数据类型。例如。 {“ a”:np.float64,“ b”:np.int32}将str或object与适当的na_values设置一起使用可保留而不解释dtype。如果指定了转换器,则会将它们应用于dtype转换。
例如
data = pd.read_csv(..., dtype={'Time': np.int64})
编辑:正如@ALollz所指出的,如果无法转换指定列中的数据,这将中断。如果要使用不同位数的数据(例如np.int32
而不是np.int64
)读数据,通常会使用它。
您可以将DataFrame上的df['Time'].astype(int)
与ojbect
一起使用,以诊断引起转换问题的数据。
答案 1 :(得分:1)
您可以轻松转换数字类型的列:
data['Time'] = data['Time'].astype(int)
尽管您的字符串字段的dtype是一个字符串对象,但它仍作为对象被卡住。我相信有可能创建一个显式为字符串的新dtype,但我不知道这样做有什么好处。
对于已编辑的问题,您要做的是定义一个转换器(因为您的文件没有针对该列的已定义数据类型)
import numpy as np
def col_fixer(x):
try:
return int(x)
except ValueError:
return np.nan
data = pd.read_csv(file_path+files, delimiter='\t', converters=dict(B=col_fixer))
然后,您可以根据需要丢弃带有NA的行。
答案 2 :(得分:0)
要绕过Pandas的错误类型推断,请使用csv阅读器将字符串提供给DataFrame构造函数。
private generateImage(fileArray: Array<any>): Observable<Image> {
return from(fileArray.map((image) => this.buildImage(image)));
}
答案 3 :(得分:0)
#ex.csv
# -0.11566111265093704,0.7655813,0
# 0.8792716084627679,0.82952684,1
# 0.5744048344633055,0.8762405,2
# -0.6245665678004078,0.24478662,3
# -0.33955465349370706,-0.042879142,4
curfile = pd.read_csv("ex.csv", dtype={0: np.float64, 1: np.float32, 2: int}, header=None)
print(type(curfile.iloc[0,0]), type(curfile.iloc[0,1]), type(curfile.iloc[0,2]))
# <class 'numpy.float64'> <class 'numpy.float32'> <class 'numpy.int32'>