我有一个字典,其中包含字符串元组作为键,列表作为值,如
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)
我怎样才能有效地做到这一点?
答案 0 :(得分:2)
您可以将Series
构造函数与str.len
一起用于元组长度,使用mask
将RequestStore
转换为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