Как выбрать все строки из фрейма данных Dask со значением, равным минимальному значению группы - PullRequest
3 голосов
/ 28 мая 2020

Итак, у меня есть следующий фрейм данных dask, сгруппированный по столбцу Problem.

| Problem | Items   | Min_Dimension | Max_Dimension | Cost  |
|-------- |------   |---------------|-------------- |------ |
| A       | 7       | 2             | 15            | 23    |
| A       | 5       | 2             | 15            | 38    |
| A       | 15      | 2             | 15            | 23    |
| B       | 11      | 6             | 10            | 54    |
| B       | 10      | 6             | 10            | 48    |
| B       | 18      | 6             | 10            | 79    |
| C       | 50      | 8             | 25            | 120   |
| C       | 50      | 8             | 25            | 68    |
| C       | 48      | 8             | 25            | 68    |
| ...     | ...     | ...           | ...           | ...   |

Цель состоит в том, чтобы создать новый фрейм данных со всеми строками, в которых значения Cost минимальны для этой конкретной группы Problem. Итак, нам нужен следующий результат:

| Problem | Items   | Min_Dimension | Max_Dimension | Cost  |
|-------- |------   |---------------|-------------- |------ |
| A       | 7       | 2             | 15            | 23    |
| A       | 15      | 2             | 15            | 23    |
| B       | 10      | 6             | 10            | 48    |
| C       | 50      | 8             | 25            | 68    |
| C       | 48      | 8             | 25            | 68    |
| ...     | ...     | ...           | ...           | ...   |

Как я могу достичь этого результата, я уже пробовал использовать idxmin(), как упоминалось в другом вопросе здесь, но затем я получил ValueError: Not all divisions are known, can't align partitions. Please use set_index to set the index.

1 Ответ

4 голосов
/ 28 мая 2020

Что, если вы создадите еще один фрейм данных, сгруппированный по Problem и Cost.min()? Допустим, новый столбец называется cost_min.

df1 = df.groupby('Problem')['Cost'].min().reset_index()

Затем слейте этот новый столбец cost_min обратно в фрейм данных.

df2 = pd.merge(df, df1, how='left', on='Problem')

Оттуда выполните что-то вроде :

df_new = df2.loc[df2['Cost'] == df2['cost_min']]

Просто написал какой-то псевдокод, но думаю, что все работает с Dask.

...