Pandas датафрейм в словарь с пользовательским форматом - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь преобразовать pandas фрейм данных в словарь, но мне нужно указать выходной формат c, я читал и просматривал много других ответов, но не могу найти; мой фрейм данных выглядит так:

   label   Min   Max   Prom    Desv. Est.  Cr    Tz    Cpk     Zup   Zlow    PPM    % OOS  # Datos
0  test1  1.25  1.46  1.329      0.0426  1.161 -0.023  0.697  2.090  3.077  19354      2      268
1  test2  4.80  5.50  5.110      0.1368  0.774 -1.097  0.926  2.778  4.972   2735      0      268
2  test3  2.58  2.96  2.747      0.0709  0.760 -1.029  0.973  2.918  4.977   1762      0      268

Я пробовал это (и другие варианты, но это наиболее похоже на вывод желания):

dict = df.set_index('label').groupby('label').apply(lambda g: g.values.tolist()).to_dict()

И я получил:

{'test1': [[1.25, 1.46, 1.329, 0.0426, 1.161, -0.023, 0.697, 2.09, 3.077, 19354.0, 2.0, 268.0]],
 'test2': [[4.8, 5.5, 5.11, 0.1368, 0.774, -1.097, 0.926, 2.778, 4.972, 2735.0, 0.0, 268.0]],
 'test3': [[2.58, 2.96, 2.747, 0.0709, 0.76, -1.0290, 0.973, 2.918, 4.977, 1762.0, 0.0, 268.0]]}

Но я ищу что-то вроде:

{'label':'test1', 'cols':[1.25, 1.46, 1.329, 0.0426, 1.161, -0.023, 0.697, 2.09, 3.077, 19354.0, 2.0, 268.0]},
{'label':'test2', 'cols': [4.8, 5.5, 5.11, 0.1368, 0.774, -1.097, 0.926, 2.778, 4.972, 2735.0, 0.0, 268.0]}, 
{'label':'test3', 'cols': [2.58, 2.96, 2.747, 0.0709, 0.76, -1.0290, 0.973, 2.918, 4.977, 1762.0, 0.0, 268.0]}

Заранее большое спасибо за любую идею или предложение.

Ответы [ 2 ]

1 голос
/ 06 января 2020

Вы можете использовать лямбда-функцию для создания нужного результата:

df.apply(lambda x: {'label':x.label, 'cols': x.tolist()[1:]}, axis=1).tolist()
0 голосов
/ 06 января 2020

Что ж, буквально читая заголовок вашего вопроса, всегда есть .to_dict () :

>>> df = pd.DataFrame([dict(a=1, b=2), dict(a=3, b=4), dict(a=5, b=6)])
>>> df
   a  b
0  1  2
1  3  4
2  5  6
>>> df.to_dict()
{'a': {0: 1, 1: 3, 2: 5}, 'b': {0: 2, 1: 4, 2: 6}}

Но ваш пример показывает, что вы ищете список диктов, которые могут быть легко получены с помощью iterrows или itertuples :

>>> df = pd.DataFrame([dict(a=1, b=2), dict(a=3, b=4), dict(a=5, b=6)])
>>> df
   a  b
0  1  2
1  3  4
2  5  6
>>> 
>>> for i, row in df.iterrows():
...   print(dict(row), list(row))
... 
{'a': 1, 'b': 2} [1, 2]
{'a': 3, 'b': 4} [3, 4]
{'a': 5, 'b': 6} [5, 6]
>>>
>>> for row in df.itertuples(index=False):
...   print(dict(row._asdict()))
... 
{'a': 1, 'b': 2}
{'a': 3, 'b': 4}
{'a': 5, 'b': 6}

Использование list(row)[1:] для пропуска метки, возможно, подойдет счет для вас.

...