Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将目录列表展平为数据帧_Python_Pandas_Dictionary_Flatten - Fatal编程技术网

Python 将目录列表展平为数据帧

Python 将目录列表展平为数据帧,python,pandas,dictionary,flatten,Python,Pandas,Dictionary,Flatten,我有一份清单,上面写着: data={'a':[80130],'b':[64],'c':[58,80]} 如何将其展平并转换为数据帧,如下所示: 将字典展平的一个选项是 flattened_data = { k + str(i): x for k, v in data.items() for i, x in enumerate(v) } 导致 {'a0': 80, 'a1': 130, 'b0': 64, 'c0': 58, 'c1': 80} 如果坚持基于1的索引,

我有一份清单,上面写着:
data={'a':[80130],'b':[64],'c':[58,80]}
如何将其展平并转换为数据帧,如下所示:


将字典展平的一个选项是

flattened_data = {
    k + str(i): x
    for k, v in data.items()
    for i, x in enumerate(v)
}
导致

{'a0': 80, 'a1': 130, 'b0': 64, 'c0': 58, 'c1': 80}

如果坚持基于1的索引,可以使用
enumerate(v,1)
而不是
enumerate(v)
。如果您想在列表只有一个条目的情况下省略索引,则应使用for循环而不是字典理解。

Imo您应首先获得dict根列表和dict叶列表

像这样:
[a,b,c]
[80130],[64],[58,80]

然后用一个循环将它们并行化,得到

[a1、a2、b、c1、c2]
[80130,64,58,80]
(这应该只需要几行代码)

然后将其加载到数据帧中


如果您需要更精确的代码,您可以询问:)

使用
pd.DataFrame
构造函数和
GroupBy
+
cumcount

data = {'a': [80, 130], 'b': [64], 'c': [58,80]}

df = pd.DataFrame([[k, w] for k, v in data.items() for w in v],
                  columns=['Index', '0'])

df['Index'] = df['Index'] + (df.groupby('Index').cumcount() + 1).astype(str)

print(df)

  Index    0
0    a1   80
1    a2  130
2    b1   64
3    c1   58
4    c2   80

将嵌套列表理解与
if-else
一起使用,如果不需要计数一个元素列表:

df = pd.DataFrame([('{}{}'.format(k, i), v1) 
                   if len(v) > 1
                   else (k, v1) 
                   for k, v in data.items() 
                   for i, v1 in enumerate(v, 1)], columns=['Index','Data'])
print (df)
  Index  Data
0    a1    80
1    a2   130
2     b    64
3    c1    58
4    c2    80
编辑:


另一种方法是使用
from_dict
,将
orient
参数设置为“index”和
stack
,最后使用
map
format
展平索引中的多级:

df = pd.DataFrame.from_dict(data, orient='index')
df_out = df.rename(columns=lambda x: x+1).stack()
df_out.index = df_out.index.map('{0[0]}{0[1]}'.format)
print(df_out)
输出:

a1     80.0
a2    130.0
b1     64.0
c1     58.0
c2     80.0
dtype: float64

使用
itertools
pd.io.\u可能\u重复数据消除\u名称

x = (itertools.product(s[0],s[1]) for s in data.items())
z = [item for z in x for item in z]
df = pd.DataFrame(z).set_index(0)
df.index = pd.io.parsers.ParserBase({'names':df.index})._maybe_dedup_names(df.index)

    1
a   80
a.1 130
b   64
c   58
c.1 80

我对答案的变化很感兴趣

defaultdict
count

枚举

谢谢你的回答。如果值是非整数,比如说float,我会得到一个TypeError:“float”对象不可编辑。如果值是float,我该怎么办@斯文·马纳契特也是我想到的第一件事。使用
枚举
{f{k}{i}:v代表k,vs在数据中。items()代表i,v在枚举(vs,1)}
中,或者,当只有一个值存在时捕获
'b'
{f{k}{如果len vs==1否则i}代表k,vs在数据中。items()代表i,v在枚举(vs,1)}
谢谢你的回答。如果值是非整数,比如说float,我会得到一个TypeError:“float”对象不可编辑。如果值是float,我该怎么办?@RemyM-不容易,因为似乎有些float与列表混合在一起。
x = (itertools.product(s[0],s[1]) for s in data.items())
z = [item for z in x for item in z]
df = pd.DataFrame(z).set_index(0)
df.index = pd.io.parsers.ParserBase({'names':df.index})._maybe_dedup_names(df.index)

    1
a   80
a.1 130
b   64
c   58
c.1 80
from collections import defaultdict
from itertools import count

c = defaultdict(lambda:count(1))

{f"{k}{['', next(c[k])][len(V) > 1]}": v for k, V in data.items() for v in V}

{'a1': 80, 'a2': 130, 'b': 64, 'c1': 58, 'c2': 80}
{f"{k}{['', i][len(V) > 1]}": v for k, V in data.items() for i, v in enumerate(V, 1)}

{'a1': 80, 'a2': 130, 'b': 64, 'c1': 58, 'c2': 80}