您如何从dask掉下行,值计数不符合某个阈值?

发布于 2025-01-27 15:21:45 字数 1501 浏览 3 评论 0原文

我正在使用一个相当大的数据集。未压缩的CSV约为20 GB。我正在尝试使用dask,但对此并不熟悉。我通常使用熊猫。我试图将列中特定值的实例数量的数量小于一定阈值的情况下丢弃行。以下是一个示例:

原始数据集:

|icao   | callsign | reg    | acftType |
|-------| -------- |------- | -------- |
|abcdef | ETH720   | ET-ASJ | B738     |
|abcdef | ETH720   | ET-ASJ | B738     |
|abcdef | ETH720   | ET-ASJ | B738     |
|123456 | IBE6827  | EC-LUK | A333     |
|123456 | IBE6827  | EC-LUK | A333     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |

如果阈值为3,则结果框架将是:

|icao   | callsign | reg    | acftType |
|-------| -------- |------- | -------- |
|abcdef | ETH720   | ET-ASJ | B738     |
|abcdef | ETH720   | ET-ASJ | B738     |
|abcdef | ETH720   | ET-ASJ | B738     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |

我找到了一种方法,但似乎非常复杂。我觉得应该有一种简单的方法。在熊猫中,这就是这样:

threshold = 3
inputFrame = inputFrame.groupby('icao').filter(lambda x: len(x) >= threshold)

但是,dask中没有过滤器()。这是我要工作的综合代码:

threshold = 3
a = inputFrame.groupby('icao').count().reg
a = a.to_frame()
a = a.rename(columns={'reg':'count'})
inputFrame = inputFrame.merge(a, how='left', on='icao')
inputFrame = inputFrame[(inputFrame['count'] >= threshold )]

是否有一种更简单的方法可以做到这一点?

I'm working with a fairly large dataset. The uncompressed CSV is about 20 GB. I'm trying to use Dask, but am not very familiar with it. I usually use Pandas. I'm trying to drop rows where the number of instances of a particular value in a column are less than a certain threshold. Here is an example:

Original dataset:

|icao   | callsign | reg    | acftType |
|-------| -------- |------- | -------- |
|abcdef | ETH720   | ET-ASJ | B738     |
|abcdef | ETH720   | ET-ASJ | B738     |
|abcdef | ETH720   | ET-ASJ | B738     |
|123456 | IBE6827  | EC-LUK | A333     |
|123456 | IBE6827  | EC-LUK | A333     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |

If the threshold is 3, the resulting dataframe would be:

|icao   | callsign | reg    | acftType |
|-------| -------- |------- | -------- |
|abcdef | ETH720   | ET-ASJ | B738     |
|abcdef | ETH720   | ET-ASJ | B738     |
|abcdef | ETH720   | ET-ASJ | B738     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |
|789ghi | FRH571   | OO-ACE | B744     |

I found a way to do it, but it seems very convoluted. I feel like there should be a simpler way. In Pandas it would be this:

threshold = 3
inputFrame = inputFrame.groupby('icao').filter(lambda x: len(x) >= threshold)

However, there is no filter() in Dask. Here is the convoluted code that I got to work:

threshold = 3
a = inputFrame.groupby('icao').count().reg
a = a.to_frame()
a = a.rename(columns={'reg':'count'})
inputFrame = inputFrame.merge(a, how='left', on='icao')
inputFrame = inputFrame[(inputFrame['count'] >= threshold )]

Is there an easier way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笛声青案梦长安 2025-02-03 15:21:45

这个问题的答案可能取决于“更轻松”的定义,但这是做到这一点的另一种方法:

策略#1 :构建iCao用虚拟列系列对于Groupby和Count,请与初始DF一起加入,然后删除虚拟列。

threshold = 3
inputFrame = inputFrame.join(
    inputFrame.icao.to_frame().assign(DROPME=0).
        groupby('icao').count().query(f'DROPME >= {threshold}'),
    on='icao', how='inner').drop(columns='DROPME').compute()

策略#2 :进行groupby并计数,然后从初始DF删除所有剩余的列,并与初始DF一起加入。

threshold = 3
inputFrame = inputFrame.join(
    inputFrame.
        groupby('icao').count().query(f'reg >= {threshold}').
            drop(columns=set(inputFrame.columns) - set(['icao'])),
    on='icao', how='inner').compute()

测试输入:

      icao    callsign       reg    acftType
1  abcdef    ETH720      ET-ASJ    B738
2  abcdef    ETH720      ET-ASJ    B738
3  abcdef    ETH720      ET-ASJ    B738
4  123456    IBE6827     EC-LUK    A333
5  123456    IBE6827     EC-LUK    A333
6  789ghi    FRH571      OO-ACE    B744
7  789ghi    FRH571      OO-ACE    B744
8  789ghi    FRH571      OO-ACE    B744
9  789ghi    FRH571      OO-ACE    B744

输出:

      icao    callsign       reg    acftType
1  abcdef    ETH720      ET-ASJ    B738
2  abcdef    ETH720      ET-ASJ    B738
3  abcdef    ETH720      ET-ASJ    B738
6  789ghi    FRH571      OO-ACE    B744
7  789ghi    FRH571      OO-ACE    B744
8  789ghi    FRH571      OO-ACE    B744
9  789ghi    FRH571      OO-ACE    B744

The answer to this question may depend on the definition of 'easier', but here are two alternative ways to do it:

Strategy #1: Build icao series up with dummy column for groupby and count, join with initial df, then drop dummy column.

threshold = 3
inputFrame = inputFrame.join(
    inputFrame.icao.to_frame().assign(DROPME=0).
        groupby('icao').count().query(f'DROPME >= {threshold}'),
    on='icao', how='inner').drop(columns='DROPME').compute()

Strategy #2: Do groupby and count, then drop all remaining columns from initial df and join with initial df.

threshold = 3
inputFrame = inputFrame.join(
    inputFrame.
        groupby('icao').count().query(f'reg >= {threshold}').
            drop(columns=set(inputFrame.columns) - set(['icao'])),
    on='icao', how='inner').compute()

Test input:

      icao    callsign       reg    acftType
1  abcdef    ETH720      ET-ASJ    B738
2  abcdef    ETH720      ET-ASJ    B738
3  abcdef    ETH720      ET-ASJ    B738
4  123456    IBE6827     EC-LUK    A333
5  123456    IBE6827     EC-LUK    A333
6  789ghi    FRH571      OO-ACE    B744
7  789ghi    FRH571      OO-ACE    B744
8  789ghi    FRH571      OO-ACE    B744
9  789ghi    FRH571      OO-ACE    B744

Output:

      icao    callsign       reg    acftType
1  abcdef    ETH720      ET-ASJ    B738
2  abcdef    ETH720      ET-ASJ    B738
3  abcdef    ETH720      ET-ASJ    B738
6  789ghi    FRH571      OO-ACE    B744
7  789ghi    FRH571      OO-ACE    B744
8  789ghi    FRH571      OO-ACE    B744
9  789ghi    FRH571      OO-ACE    B744
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文