有效地将带有元组键和列表值的字典转换为DataFrame

时间:2017-05-18 10:06:06

标签: python pandas

我有一个字典,其中包含字符串元组作为键,列表作为值,如

mydict = {(('aa', 'bbbb'), ('c',)): [1,52,35,12], (('c', 'aa'), ('d',)): [4424,512]}

我想进入panas DataFrame,其中元组键应该是一列而值是另一列。此外,我需要保存在列中的元组的长度。最后,我需要将键的长度除以键的长度作为另一列。

目前我正在使用代码

myDF = pd.DataFrame()
for key, value in mydict.items():
    myDF_temp = pd.DataFrame.from_dict({'value_count': [len(value) / len(key)],
                                        'key_count': [len(key)]})
    myDF_temp['key'] = 1
    myDF_temp['value'] = 1
    myDF_temp['key'] = myDF_temp['key'].astype(object)
    myDF_temp['value'] = myDF_temp['value'].astype(object)
    myDF_temp.set_value(0, 'key', tuple(key))
    myDF_temp.set_value(0, 'value', tuple(value))
    myDF = myDF.append(myDF_temp)
由于重新附加了DataFrame,

非常慢。

对于这个例子,我希望

myDF
   key_count  value_count                 key            value
0          2            1     ((c, aa), (d,))      (4424, 512)
0          2            2  ((aa, bbbb), (c,))  (1, 52, 35, 12)

我怎样才能有效地做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以将Series构造函数与str.len一起用于元组长度,使用maskRequestStore转换为tuples apply

mydict = {('a', 'b'): [1,2,3], ('c'): [4,5]}

df = pd.Series(mydict).reset_index()
df.columns = ['key','value']
print (df)
      key      value
0       c     [4, 5]
1  (a, b)  [1, 2, 3]

l = df['key'].str.len()
df['key_count'] = l
df['value_count'] = df['value'].str.len() / l
df['key']  = df['key'].mask(l == 1, df['key'].apply(tuple))
df['value']  = df['value'].apply(tuple)
print (df)
      key      value  key_count  value_count
0    (c,)     (4, 5)          1          2.0
1  (a, b)  (1, 2, 3)          2          1.5

随身携带新数据:

print (df)
           key            value  key_count  value_count
0        (c,)      (4424, 512)          1          2.0
1  (aa, bbbb)  (1, 52, 35, 12)          2          2.0

编辑:

mydict = {(('aa', 'bbbb'), ('c',)): [1,52,35,12], (('c', 'aa'), ('d',)): [4424,512]}
s1 = pd.Series(mydict)
s = pd.Series(s1.index.values.tolist())
df = pd.concat([s,s1.reset_index(drop=True)], axis=1)
df.columns = ['key','value']
print (df)
                  key            value
0  ((aa, bbbb), (c,))  [1, 52, 35, 12]
1     ((c, aa), (d,))      [4424, 512]

l = df['key'].str.len()
df['key_count'] = l
df['value_count'] = df['value'].str.len() / l
df['key']  = df['key'].mask(l == 1, df['key'].apply(tuple))
df['value']  = df['value'].apply(tuple)
print (df)
                  key            value  key_count  value_count
0  ((aa, bbbb), (c,))  (1, 52, 35, 12)          2          2.0
1     ((c, aa), (d,))      (4424, 512)          2          1.0

答案 1 :(得分:0)

事实证明,答案非常简单。诀窍是将列表放入一个列表(速度非常快),以便只有Content-Length解压缩外部列表:

.from_dict
相关问题