Python 熊猫从列表的目录中创建df

Python 熊猫从列表的目录中创建df,python,pandas,Python,Pandas,我有一个动态填充的数据结构,所以键和子键的数量是未知的。我想把它转换成一个熊猫df。结构看起来像这样 datastore = { "user1":{ "time1":[1,2,3,4], "time2":[5,6,7,8], "time3":[1,2,3,4] }, "user2":{ "time1":[1,2,3,4], "time2":[5,6,7,8] } } index us

我有一个动态填充的数据结构,所以键和子键的数量是未知的。我想把它转换成一个熊猫df。结构看起来像这样

    datastore = {
    "user1":{
        "time1":[1,2,3,4], 
        "time2":[5,6,7,8], 
        "time3":[1,2,3,4] },
    "user2":{ 
        "time1":[1,2,3,4], 
        "time2":[5,6,7,8] }
}
index users times x y z k
0     user1 time1 1 2 3 4
1     user1 time2 5 6 7 8
2     user1 time3 1 2 3 4
3     user2 time1 1 2 3 4
4     user2 time2 5 6 7 8 
....
有价值清单的一组词典

我想把它转换成这样

    datastore = {
    "user1":{
        "time1":[1,2,3,4], 
        "time2":[5,6,7,8], 
        "time3":[1,2,3,4] },
    "user2":{ 
        "time1":[1,2,3,4], 
        "time2":[5,6,7,8] }
}
index users times x y z k
0     user1 time1 1 2 3 4
1     user1 time2 5 6 7 8
2     user1 time3 1 2 3 4
3     user2 time1 1 2 3 4
4     user2 time2 5 6 7 8 
....
我已经尝试了pd.DataFrame(dict),来自于dict方法,但无法使其工作。任何帮助都将不胜感激

编辑:很抱歉出现语法错误,修复了

以下是一种方法

datastore = {
"user1":{
    "time1":[1,2,3,4], 
    "time2":[5,6,7,8], 
    "time3":[1,2,3,4] },
"user2":{ 
    "time1":[1,2,3,4], 
    "time2":[5,6,7,8]}
}
我们可以将pd.DataFrame()与dict一起使用,然后使用stack()重新设置索引()

现在,我们使用pd.Series将列表“拆分”到0中,然后将其连接回级别_1和级别_2。一些列重命名,我们就完成了

df = df[['level_1', 'level_0']].join(df[0].apply(pd.Series))
df.columns = ['users', 'times', 'x', 'y', 'z', 'k']
print(df)
   users  times  x  y  z  k
0  user1  time1  1  2  3  4
1  user2  time1  1  2  3  4
2  user1  time2  5  6  7  8
3  user2  time2  5  6  7  8
4  user1  time3  1  2  3  4

选项1

pd.DataFrame.from_dict(datastore, 'index').stack() \
    .rename_axis(['users', 'times']) \
    .apply(pd.Series, index=list('xyzk')).reset_index()

   users  times  x  y  z  k
0  user1  time1  1  2  3  4
1  user1  time2  5  6  7  8
2  user1  time3  1  2  3  4
3  user2  time1  1  2  3  4
4  user2  time2  5  6  7  8
pd.DataFrame(
    [[u, t] + l for u, td in datastore.items() for t, l in td.items()],
    columns='users times x y z k'.split()
)

   users  times  x  y  z  k
0  user1  time1  1  2  3  4
1  user1  time2  5  6  7  8
2  user1  time3  1  2  3  4
3  user2  time1  1  2  3  4
4  user2  time2  5  6  7  8
%timeit pd.DataFrame.from_dict(datastore, 'index').stack().rename_axis(['users', 'times']).apply(pd.Series, index=list('xyzk')).reset_index()
%timeit pd.DataFrame([[u, t] + l for u, td in datastore.items() for t, l in td.items()], columns='users timets x y z k'.split())

100 loops, best of 3: 2.72 ms per loop
1000 loops, best of 3: 556 µs per loop

选项2

pd.DataFrame.from_dict(datastore, 'index').stack() \
    .rename_axis(['users', 'times']) \
    .apply(pd.Series, index=list('xyzk')).reset_index()

   users  times  x  y  z  k
0  user1  time1  1  2  3  4
1  user1  time2  5  6  7  8
2  user1  time3  1  2  3  4
3  user2  time1  1  2  3  4
4  user2  time2  5  6  7  8
pd.DataFrame(
    [[u, t] + l for u, td in datastore.items() for t, l in td.items()],
    columns='users times x y z k'.split()
)

   users  times  x  y  z  k
0  user1  time1  1  2  3  4
1  user1  time2  5  6  7  8
2  user1  time3  1  2  3  4
3  user2  time1  1  2  3  4
4  user2  time2  5  6  7  8
%timeit pd.DataFrame.from_dict(datastore, 'index').stack().rename_axis(['users', 'times']).apply(pd.Series, index=list('xyzk')).reset_index()
%timeit pd.DataFrame([[u, t] + l for u, td in datastore.items() for t, l in td.items()], columns='users timets x y z k'.split())

100 loops, best of 3: 2.72 ms per loop
1000 loops, best of 3: 556 µs per loop

定时

pd.DataFrame.from_dict(datastore, 'index').stack() \
    .rename_axis(['users', 'times']) \
    .apply(pd.Series, index=list('xyzk')).reset_index()

   users  times  x  y  z  k
0  user1  time1  1  2  3  4
1  user1  time2  5  6  7  8
2  user1  time3  1  2  3  4
3  user2  time1  1  2  3  4
4  user2  time2  5  6  7  8
pd.DataFrame(
    [[u, t] + l for u, td in datastore.items() for t, l in td.items()],
    columns='users times x y z k'.split()
)

   users  times  x  y  z  k
0  user1  time1  1  2  3  4
1  user1  time2  5  6  7  8
2  user1  time3  1  2  3  4
3  user2  time1  1  2  3  4
4  user2  time2  5  6  7  8
%timeit pd.DataFrame.from_dict(datastore, 'index').stack().rename_axis(['users', 'times']).apply(pd.Series, index=list('xyzk')).reset_index()
%timeit pd.DataFrame([[u, t] + l for u, td in datastore.items() for t, l in td.items()], columns='users timets x y z k'.split())

100 loops, best of 3: 2.72 ms per loop
1000 loops, best of 3: 556 µs per loop

调试
如果复制并粘贴此代码。。。它应该运行。请尝试并报告它确实运行了

import pandas as pd

datastore = {
    "user1":{
        "time1":[1,2,3,4], 
        "time2":[5,6,7,8], 
        "time3":[1,2,3,4] },
    "user2":{ 
        "time1":[1,2,3,4], 
        "time2":[5,6,7,8]}
}

pd.DataFrame.from_dict(datastore, 'index').stack() \
    .rename_axis(['users', 'times']) \
    .apply(pd.Series, index=list('xyzk')).reset_index()

你的“口述中的口述”在语法上是不正确的。我们将浪费时间在引号、逗号和冒号上。请清理它。编辑为语法正确,谢谢您的输入。这个问题看起来很相似,可能会有帮助。谢谢您的回复,区别在于用户数量和时间是动态的,并且是动态命名的。此外,每次在用户中我都要创建一个新行。您发布的链接将两个键合并为索引。编辑:我可以使用您链接的解决方案,并将索引分为两列。然而,我想知道是否有更好的解决方案好的交易,很高兴帮助这给了我一个错误。TypeError:“numpy.ndarray”对象不可用callable@someRandomGuy我加入了我的帖子。请运行准确的代码并告诉我它是否有效。