在字典中拆分元组并转换为数据框

Split a tuple within a dict and convert into dataframe

我有一个如下所示的数据框

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)]}

我想做以下事情

a) 根据, 逗号分隔符

拆分字典中的元组

b) 将数字部分存储在数据框的 value 列中,将文本部分存储在数据框的 feature 列中

c) 重复数据框中所有值的键值(并将其存储在 key 列中)

我尝试了下面的方法,但它不是 efficient/elegant 并且不能扩展到百万行的大数据

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'])

我希望我的输出如下所示

使用具有展平值的生成器理解并传递给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

您甚至可以对数据使用生成器理解来避免在内存中构建完整列表:

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