Python 在Dask中使用read_csv进行列名移位
我正在尝试使用对csv数据集进行编目。它使用Dask实现,Dask实现又使用pandas实现 我看到的问题是,我加载的csv文件没有索引列,因此Dask将第一列解释为索引,然后将列名向右移动 例如: datetime(dt)列应该是第一列,但当读取csv时,它会被解释为索引,列名会发生移位,因此会从正确的位置偏移。我在read\u csv调用中提供列Python 在Dask中使用read_csv进行列名移位,python,pandas,csv,dask,intake,Python,Pandas,Csv,Dask,Intake,我正在尝试使用对csv数据集进行编目。它使用Dask实现,Dask实现又使用pandas实现 我看到的问题是,我加载的csv文件没有索引列,因此Dask将第一列解释为索引,然后将列名向右移动 例如: datetime(dt)列应该是第一列,但当读取csv时,它会被解释为索引,列名会发生移位,因此会从正确的位置偏移。我在read\u csv调用中提供列名称列表和dtypes字典 据我所知,如果我使用pandas,我会提供要修复的index\u col=Falsekwarg,如图所示,但Dask返回
名称
列表和dtypes
字典
据我所知,如果我使用pandas,我会提供要修复的index\u col=False
kwarg,如图所示,但Dask返回一个故意错误,说明:关键字“index”和“index\u col”不受支持。使用dd.read\u csv(…)。改为设置索引('my-index')
。这似乎是由于并行化的限制
在这种情况下,建议的修复(使用set\u index('my-index)
)无效,因为它需要读取整个文件,同时还要使用列名来设置索引。主要问题是,如果名称为offset,我无法准确设置索引列
在Dask中,加载不显式具有索引列的csv的最佳方式是什么,以便解释的索引列至少保留指定的列名
更多信息:
我正在使用的播放数据集:
我使用的Intraction catalog.yml文件如下所示:
name:
intake-explore-catalog
metadata:
version: 1
sources:
ufo_sightings:
description: data around ufo sightings
driver: csv
args:
urlpath: "{{CATALOG_DIR}}/data/ufo_scrubbed.csv"
csv_kwargs:
header: 0
names: ['dt', 'city', 'state', 'country', 'shape', 'duration_s', 'duration_hm', 'comments', 'date_posted', 'latitude']
dtype: {'dt': 'str', 'city': 'str', 'state': 'str', 'country': 'str', 'shape': 'str', 'duration_s': 'str', 'duration_hm': 'str', 'comments': 'str', 'date_posted': 'str', 'latitude': 'str'}
infer_datetime_format: true
metadata:
version: 1
custom_field: blah
cat = intake.open_catalog("catalog.yml")
ufo_ds = cat.ufo_sightings.read()
我正在使用以下命令加载目录和相应的数据集:
name:
intake-explore-catalog
metadata:
version: 1
sources:
ufo_sightings:
description: data around ufo sightings
driver: csv
args:
urlpath: "{{CATALOG_DIR}}/data/ufo_scrubbed.csv"
csv_kwargs:
header: 0
names: ['dt', 'city', 'state', 'country', 'shape', 'duration_s', 'duration_hm', 'comments', 'date_posted', 'latitude']
dtype: {'dt': 'str', 'city': 'str', 'state': 'str', 'country': 'str', 'shape': 'str', 'duration_s': 'str', 'duration_hm': 'str', 'comments': 'str', 'date_posted': 'str', 'latitude': 'str'}
infer_datetime_format: true
metadata:
version: 1
custom_field: blah
cat = intake.open_catalog("catalog.yml")
ufo_ds = cat.ufo_sightings.read()
这将产生如上所示的读入数据框和该数据的csv副本:
,dt,city,state,country,shape,duration_s,duration_hm,comments,date_posted,latitude
10/10/1949 20:30,san marcos,tx,us,cylinder,2700,45 minutes,This event took place in early fall around 1949-50. It occurred after a Boy Scout meeting in the Baptist Church. The Baptist Church sit,4/27/2004,29.8830556,-97.9411111
10/10/1949 21:00,lackland afb,tx,,light,7200,1-2 hrs,1949 Lackland AFB, TX. Lights racing across the sky & making 90 degree turns on a dime.,12/16/2005,29.38421,-98.581082
10/10/1955 17:00,chester (uk/england),,gb,circle,20,20 seconds,Green/Orange circular disc over Chester, England,1/21/2008,53.2,-2.916667
10/10/1956 21:00,edna,tx,us,circle,20,1/2 hour,My older brother and twin sister were leaving the only Edna theater at about 9 PM,...we had our bikes and I took a different route home,1/17/2004,28.9783333,-96.6458333
10/10/1960 20:00,kaneohe,hi,us,light,900,15 minutes,AS a Marine 1st Lt. flying an FJ4B fighter/attack aircraft on a solo night exercise, I was at 50ꯠ' in a "clean" aircraft (no ordinan,1/22/2004,21.4180556,-157.8036111
与原始/原始数据csv(无前导逗号)相比:
Dask调用:
df = dask.dataframe.read_csv('data/ufo_scrubbed.csv',
names=['dt',
'city',
'state',
'country',
'shape',
'duration_s',
'duration_hm',
'comments',
'date_posted',
'latitude'],
dtype = {'dt': 'str',
'city': 'str',
'state': 'str',
'country': 'str',
'shape': 'str',
'duration_s': 'str',
'duration_hm': 'str',
'comments': 'str',
'date_posted': 'str',
'latitude': 'str'}
)
不幸的是,标题行以逗号开头,这就是为什么列名以1开头。你最好去解决它,而不是去解决它 但是,如果不提供列名,则不会自动获取索引:
df = dask.dataframe.read_csv('file.csv', header=0)
这里的索引只是一个范围(每个分区从0开始计数)。然后可以在事件发生后指定列名
df2 = df.rename(columns=dict(zip(df.columns, df.columns[1:]), latitude='longitude'))
单凭摄入处方无法实现这一点,您必须通过to_dask()或read()(分别用于dask或pandas输出)获取数据帧。能否发布您正在使用的摄入块,以及等效的
dd.read_csv
调用?您的原始数据片段也很好。对不起,最好是CSV文件内容,作为复制/可复制文本而不是图像,以方便回答者的生活。我添加了更多信息,如果您需要更多信息,请告诉我。在读取原始数据的结果csv中显示了额外的未命名列,导致shiftI还为read_csv函数添加了dask调用。很尴尬,我没有注意到这一点。smh感谢您花时间调查此事!我又看了一眼原始数据,它的标题似乎没有以逗号开头。前面的逗号似乎是由read\u csv
函数调用引入的。我认为问题在于我提供的列名列表的长度与数据中的列数不同。你是说read_csv后跟to_csv?如果你能制作一个小巧的复制机,这听起来像是一个你可以发布的bug。是的,这就是我在这过程中注意到的行为。这是一个很好的观点,我绝对可以尝试做一个全面的bug报告。再次感谢您的时间和帮助