Python 熊猫从列表的目录中创建df
我有一个动态填充的数据结构,所以键和子键的数量是未知的。我想把它转换成一个熊猫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
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我加入了我的帖子。请运行准确的代码并告诉我它是否有效。