【问题标题】:How can I compare columns of a dask dataframe?如何比较 dask 数据框的列?
【发布时间】: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_csvpd.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


【解决方案1】:

这可能是因为您的 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()

【讨论】:

    【解决方案2】:

    其实我想通了。

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

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

    之后就简单了

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

    工作得很好。加载 Dataframe 后,我无法弄清楚如何修复 dtype 分配(使用 astype() 并没有解决我的问题)。

    错误消息几乎具有可笑的误导性,因为它告诉我修复pd.read_csv 的调用,而我需要修复的调用是dask.dataframe.read_csv

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      相关资源
      最近更新 更多