У меня есть фрейм данных, как показано ниже

td = {966: [('Feat1', -0.04),
  ('Feat2=True ', -0.02),
  ('Feat3 <= 20000.00', 0.01),
  ('Feat4=Power Supply', -0.01),
  ('Feat5=dada', -0.0)],
 879: [('Feat8=Rare', 0.02),
  ('Feat11=HV', -0.01),
  ('Feat21=Power Supply', -0.01),
  ('20000.00 < Feat3 <= 50000.00', 0.01),
  ('Feat5=dada', -0.01)]}

Я хотел бы сделать ниже

А) Разделить кортеж в dict на основе запятой ,

Б) сохранить числовую часть в столбце value фрейма данных и текстовую часть в столбце feature фрейма данных

C) повторите значения ключей для всех значений в кадре данных (и сохраните их в столбце key)

Я попробовал следующее, но это неэффективно/элегантно и не масштабируется для больших данных из миллионов строк.

feature=[]
value=[]
key=[]
for k, v in td.items():
    for x in v:
        key.append(k)
        f, v  = x
        feature.append(f)
        value.append(v)
data_tuples = list(zip(key,feature,value))
pd.DataFrame(data_tuples, columns=['key','feature','value'])

Я ожидаю, что мой выход будет, как показано ниже

enter image description here

1
The Great 4 Фев 2022 в 13:06

2 ответа

Лучший ответ

Используйте понимание генератора с плоскими значениями и перейдите к конструктору DataFrame:

df = pd.DataFrame()(k,b,c) for k, v in td.items() for b, c in v), 
                  columns=['key','feature','value'])
print (df)
   key                       feature  value
0  966                         Feat1  -0.04
1  966                   Feat2=True   -0.02
2  966             Feat3 <= 20000.00   0.01
3  966            Feat4=Power Supply  -0.01
4  966                    Feat5=dada  -0.00
5  879                    Feat8=Rare   0.02
6  879                     Feat11=HV  -0.01
7  879           Feat21=Power Supply  -0.01
8  879  20000.00 < Feat3 <= 50000.00   0.01
9  879                    Feat5=dada  -0.01
1
jezrael 4 Фев 2022 в 13:31
Спасибо за помощь. проголосовал..
 – 
The Great
4 Фев 2022 в 13:11
1
Такое элегантное 1-строчное решение. хорошо
 – 
The Great
4 Фев 2022 в 13:13

Вы даже можете использовать понимание генератора для данных, чтобы избежать создания полного списка в памяти:

pd.DataFrame(([k, elt[0], elt[1]] for  k,v in td.items() for elt in v),
             columns = ['key', 'Feature', 'Value'])

   key                       Feature  Value
0  966                         Feat1  -0.04
1  966                   Feat2=True   -0.02
2  966             Feat3 <= 20000.00   0.01
3  966            Feat4=Power Supply  -0.01
4  966                    Feat5=dada  -0.00
5  879                    Feat8=Rare   0.02
6  879                     Feat11=HV  -0.01
7  879           Feat21=Power Supply  -0.01
8  879  20000.00 < Feat3 <= 50000.00   0.01
9  879                    Feat5=dada  -0.01
2
Serge Ballesta 4 Фев 2022 в 13:17
Спасибо, проголосовал за помощь
 – 
The Great
4 Фев 2022 в 13:20