В pandas я могу сделать следующее, чтобы получить словарь ключ/значение из to_dict
d = [{'key':'a', 'value':1}, {'key':'b', 'value':2}, {'key':'b', 'value':1}]
df = pd.DataFrame(d)
df.groupby('key')['value'].sum().to_dict()
Out[13]: {'a': 1, 'b': 3}
Когда я пытаюсь воспроизвести это в полярах, я получаю следующее:
df = pl.DataFrame(d)
In [133]: df.groupby('key').agg(pl.col('value').sum()).to_dict(as_series=False)
Out[133]: {'key': ['a', 'b'], 'value': [1, 3]}
In [134]: df.groupby('key').agg(pl.col('value').sum()).transpose().to_dict(as_series=False)
Out[134]: {'column_0': ['b', '3'], 'column_1': ['a', '1']}
Хотя это технически правильно, распаковка этого в соответствии с тем, что pandas возвращает для большого фрейма данных, будет медленной. Как я могу сделать так, чтобы поляры возвращали тот же ключ/значение, что и приведенный выше фрагмент панды?
Использование .iter_rows()
dict(df.groupby('key').agg(pl.col('value').sum()).iter_rows())
{'a': 1, 'b': 3}
Что также можно записать с помощью GroupBy.sum() ref: @DeanMacGregor
dict(df.groupby('key').sum().iter_rows())
Ах, приятно знать, это также довольно много печатать. Я обнаружил, что .iter_rows
тоже работает, если вы хотите посмотреть, как это работает.
Хорошо, .iter_rows
намного быстрее в моем локальном тестировании, поэтому я удалил предыдущие предложения.
Вы можете просто сделать df.groupby('key').sum()
, если это фрейм данных, а не ленивый фрейм, чтобы сократить набор текста.
Спасибо @DeanMacGregor - похоже, есть и ленивая версия, ей просто нужен .collect()
перед .iter_rows()
Nice .iter_rows()
работает даже быстрее, чем предыдущая версия с использованием zip
Второй кажется намного быстрее, первый почти такой же скорости, как панды