Преобразование значений dict, представляющих собой список различной длины, в один список, а затем добавление этого списка в кадр данных. - PullRequest
0 голосов
/ 28 февраля 2020

Мой вопрос является продолжением вопроса, который я задал на прошлой неделе .

У меня есть данные, которые были представлены в виде list словарей. Значения словарей: list из int значений различной длины. Они находятся в pandas DataFrame с именем df_sim (имя столбца rrintervals)

startedat                   rrintervals
0   2020-02-27 15:06:35     [{'values': [727.0]}, {'values': [693.0, 688.0...
1   2020-02-27 15:06:22     [{'values': [1067.0]}, {'values': [921.0]}, {'...
2   2020-02-27 15:36:52     [{'values': [776.0]}, {'values': [826.0, 938.0..

IN:
print(df_sim.loc[0, "rrintervals"])

OUT:
[{'values': [727.0]}, {'values': [693.0, 688.0]}, {'values': [689.0]}, {'values': [699.0]}]

Я хотел бы получить все значения dict в столбце rrintervals в один список, и я хочу для сохранения в новом столбце в df_sim, который называется rr_list.

startedat                   rrintervals                                           rr_list
0   2020-02-27 15:06:35     [{'values': [727.0]}, {'values': [693.0, 688.0...     [727.0, 693.0, 688.0...]
1   2020-02-27 15:06:22     [{'values': [1067.0]}, {'values': [921.0]}, {'...     [1067.0, 921.0...]
2   2020-02-27 15:36:52     [{'values': [776.0]}, {'values': [826.0, 938.0..      [776.0, 826.0, 938.0...]

IN:
print(df_sim.loc[0, "rr_list"])

OUT:
[727.0, 693.0, 688.0, 689.0, 699.0]

Я попытался применить лучший ответ из моего последнего вопроса, в котором рекомендовалось использовать понимание списка

for i in df_sim.index:
    df_sim.loc[i, "rr_list"] = [val for sub_dict in df_sim.loc[i, "rrintervals"] for val in sub_dict['values']]

Но я продолжал получать ValueError:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-152-c50bd1585f57> in <module>
      1 for i in df_sim.index:
----> 2     df_sim.loc[i, "rr_list"] = [val for sub_dict in df_sim.loc[i, "rrintervals"] for val in sub_dict['values']]

~/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in __setitem__(self, key, value)
    668             key = com.apply_if_callable(key, self.obj)
    669         indexer = self._get_setitem_indexer(key)
--> 670         self._setitem_with_indexer(indexer, value)
    671 
    672     def _validate_key(self, key, axis: int):

~/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in _setitem_with_indexer(self, indexer, value)
   1015                     if len(labels) != len(value):
   1016                         raise ValueError(
-> 1017                             "Must have equal len keys and value "
   1018                             "when setting with an iterable"
   1019                         )

ValueError: Must have equal len keys and value when setting with an iterable

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Ваше решение, кажется, хорошо.
Если вы хотите однострочник:

df['rr_list'] = df['rrintervals'].apply(lambda x: pd.DataFrame.from_records(x).sum())
0 голосов
/ 28 февраля 2020

Хах. Я нашел то, что искал, через несколько минут после публикации.

Я создал пустой list вне моего for l oop, заполнил его результатами анализа списка, а затем присвоил заполненный список новому столбцу.

rr_list = []
for i in df_sim.index:
    rr_list.append([val for sub_dict in df_sim.loc[i, "rrintervals"] for val in sub_dict['values']])

df_sim["rr_list"] = rr_list

Я открыт для альтернативных ответов!

...