【发布时间】:2021-01-06 00:21:25
【问题描述】:
我有大量数据已读入 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_csv 和 pd.read_table 都没有涉及。但是,pandas.read_text 在回溯中,因此可能 dask 正在为数据的不同分片写入文件。
(如果有帮助,我正在使用 dask 版本 1.2.2。我在高性能集群上使用它,它落后于软件的前沿。)
【问题讨论】:
-
你试过
(df['growth_media_1'].compute() == df['growth_media_2'].compute()).all()吗?如果可能有几行关闭,但您仍然认为它非常多余,那么使用(df['growth_media_1'].compute() == df['growth_media_2'].compute()).value_counts(normalize=True)来查看 %match。我知道你会在这两个系列上调用compute,这可能会占用大量内存。
标签: python pandas dask dask-dataframe