pandas - 如何更改熊猫列表的方向
问题描述
我有以下三个列表。
mylist = [["sensor9", [[0.5, 0.3, 0.8, 0.9, 0.8], [0.5, 0.6, 0.8, 0.9, 0.9]]],
["sensor12", [[10.6, 0.5, 0.9, 1.0, 0.9], [10.6, 0.9, 0.8, 0.8, 0.8]]]]
columns = ['score_1', 'score_2']
years = [2001, 2002, 2003, 2004, 2005]
我想改变方向mylist
如下使用作为columns
标题和. 更具体地说,我的最终输出应如下所示。years
mylist
id, sensor, time, score_1, score_2
0, sensor9, 2001, 0.5, 0.5
0, sensor9, 2002, 0.3, 0.6
0, sensor9, 2003, 0.8, 0.8
0, sensor9, 2004, 0.9, 0.9
0, sensor9, 2005, 0.8, 0.9
1, sensor12, 2001, 0.6, 0.6
1, sensor12, 2002, 0.5, 0.9
1, sensor12, 2003, 0.9, 0.8
1, sensor12, 2004, 1.0, 0.8
1, sensor12, 2005, 0.9, 0.8
描述上述数据框 id 的数据框
id, sensor
0, sensor9
1, sensor12
我试图DataFrame.from_dict
在熊猫中做到这一点。但是,我不确定如何更改 的方向mylist
并将其与years
熊猫中的对齐。是否有可能做到这一点?
如果需要,我很乐意提供更多详细信息。
解决方案
使用列表推导生成DataFrame
具有转置的列表(嵌套列表)的第二个值 by DataFrame.T
,然后concat
一起并最后id
通过Series.map
和DataFrame.insert
为第一个位置创建新列:
df1 = pd.DataFrame({'id':[0,1],
'sensor':['sensor9','sensor12']})
mylist = [["sensor9", [[0.5, 0.3, 0.8, 0.9, 0.8], [0.5, 0.6, 0.8, 0.9, 0.9]]],
["sensor12", [[10.6, 0.5, 0.9, 1.0, 0.9], [10.6, 0.9, 0.8, 0.8, 0.8]]]]
columns = ['score_1', 'score_2']
years = [2001, 2002, 2003, 2004, 2005]
L = [pd.DataFrame(x[1], index=columns, columns=years).T for x in mylist]
df = pd.concat(L, keys=[x[0] for x in mylist]).rename_axis(('sensor','time')).reset_index()
df.insert(0, 'id', df['sensor'].map(df1.set_index('sensor')['id']))
print (df)
id sensor time score_1 score_2
0 0 sensor9 2001 0.5 0.5
1 0 sensor9 2002 0.3 0.6
2 0 sensor9 2003 0.8 0.8
3 0 sensor9 2004 0.9 0.9
4 0 sensor9 2005 0.8 0.9
5 1 sensor12 2001 10.6 10.6
6 1 sensor12 2002 0.5 0.9
7 1 sensor12 2003 0.9 0.8
8 1 sensor12 2004 1.0 0.8
9 1 sensor12 2005 0.9 0.8
编辑:
mylist = [["sensor9", [[0.5, 0.3, 0.8, 0.9, 0.8], [0.5, 0.6, 0.8, 0.9, 0.9]]],
["sensor12", [[10.6, 0.5, 0.9, 1.0, 0.9], [10.6, 0.9, 0.8, 0.8, 0.8]]]]
columns = ['score_1', 'score_2']
years = [2001, 2002, 2003, 2004, 2005]
L = [pd.DataFrame(x[1], index=columns, columns=years).T for x in mylist]
df = pd.concat(L, keys=[x[0] for x in mylist]).rename_axis(('sensor','time')).reset_index()
df.insert(0, 'id', pd.factorize(df['sensor'])[0])
print (df)
id sensor time score_1 score_2
0 0 sensor9 2001 0.5 0.5
1 0 sensor9 2002 0.3 0.6
2 0 sensor9 2003 0.8 0.8
3 0 sensor9 2004 0.9 0.9
4 0 sensor9 2005 0.8 0.9
5 1 sensor12 2001 10.6 10.6
6 1 sensor12 2002 0.5 0.9
7 1 sensor12 2003 0.9 0.8
8 1 sensor12 2004 1.0 0.8
9 1 sensor12 2005 0.9 0.8
推荐阅读
- ios - 如何在 UICollectionViewHeader 中添加 UIView (swift 5)
- django - 'QueryDict' 对象没有属性 'first_name'
- python - 裁剪多边形并将其转换为灰度
- java - Maven version:update 不更新给定版本,它与 repo 比较并更新到最新而不是给定版本
- apache-spark - Spark Yarn Cluster - hive 列数大于 200 时出现 java.lang.StackOverflowError 错误
- elasticsearch - Grafana图总计数显示为列表?
- php - 使用 Laravel Excel 制作相当于 pandas.read_csv(file) 的内容
- r - Xl.Read.File 函数不会读取所有行
- ios - 如果设备上仅设置了设备代码,IOS 无法创建私钥?
- jenkins - Jenkinsfile:为什么 `java.lang.NoSuchMethodError: No such DSL method` 没有被捕获?