如何比较dask数据帧的列



我有一个大的数据数组,我已经将其读取到dask数据帧中。这个数据帧有两列,我认为它们是多余的(即具有相同的值(。这些列是字符串值的——它们给出了用于培育细胞集落的生长培养基的名称。

在删除其中一列之前,我想检查一下我的假设,即这两列是相同的。

我能想到的最简单的解决方案如下:

(df['growth_media_1'] == df['growth_media_2']).all().compute()

但这给了我以下错误:

ValueError: Mismatched dtypes found in `pd.read_csv`/`pd.read_table`.
+--------+---------+----------+
| Column | Found   | Expected |
+--------+---------+----------+
| input  | float64 | int64    |
| output | float64 | int64    |
+--------+---------+----------+
Usually this is due to dask's dtype inference failing, and
*may* be fixed by specifying dtypes manually by adding:
dtype={'input': 'float64',
'output': 'float64'}

我想这可能是因为列中有一些NaN,所以我在比较之前尝试了.dropna()。但这并没有解决问题。

经过大范围的挣扎,我最终陷入了这个神秘的混乱:

(df['growth_media_1'].dropna() == df['growth_media_2'].dropna()).astype('bool').all().compute()

但即使也不能解决我的问题。

错误消息真的没有帮助,因为据我所知,pd.read_csvpd.read_table都没有涉及。然而,pandas.read_text在回溯中,所以dask可能正在为不同的数据碎片编写文件。

(如果有帮助的话,我使用的是dask 1.2.2版本。我在高性能集群上使用它,它落后于软件的前沿。(

这可能是因为Dask数据帧中的类型不一致。如果不查看您的数据,很难弄清楚问题出在哪里。但您可能可以执行以下操作来强制类型。

df[['growth_media_1', 'growth_media_2']] = df[['growth_media_1', 'growth_media_2']].astype('float64')
(df['growth_media_1'] == df['growth_media_2']).all().compute()

实际上,我想明白了。

我需要做的是最初使用assume_missing=True参数读取数据。像这样:

df = dd.read_csv('r1c5va879uaex_r1c639xp952g4.csv', assume_missing=True)

之后,简单的

(df['growth_media_1'] == df['growth_media_2']).all().compute()

工作得很好。我不知道如何在加载数据帧后修复数据类型分配(使用astype()并不能解决我的问题(。

错误消息几乎是滑稽的误导,因为它告诉我修复pd.read_csv的调用,而dask.dataframe.read_csv是我需要修复的调用。

最新更新