python - 在python中重新排列表格
问题描述
我有一个包含 700 多行的表(example_table.txt)。每行包含对应于 17 个不同类别的值。我想以下列方式重新排列我的表格(Desired_output.text)
Example_table.txt 链接(https://drive.google.com/file/d/1sz9XkPzMqCZItUBN-QugQKq39X0buIoX/view?usp=sharing)
Desired_output.txt 链接(https://drive.google.com/file/d/1OXm2b4VMbuQ1GqBzBf48bDE_gPyzRpnU/view?usp=sharing)
输入表
ID Class 1 Class 2 Class 3 Class 4 Class 5 Class 6 Class 7 Class 8 Class 9 Class 10 Class 11 Class 12 Class 13
1 0 0.0013865 0 0 0.0005675 0.00317325 0.00008725 0 0.0000925 0 0 0 0
2 0 0.02396475 0 0 0.00045075 0.008391 0.00161075 0 0.00033725 0 0 0 0
3 0 0.0260415 0 0 0 0.0210125 0.011682 0 0.00092125 0 0 0 0
4 0 0.01287525 0 0.00007425 0 0.02698525 0.02130875 0 0.0012565 0 0 0 0
5 0 0.008697 0.00012475 0 0.012641 0.00643825 0.0332455 0 0.00116475 0 0.00018875 0 0
期望的输出
Id No of class and Class Name Area
1 5
2 0.0013865
5 0.0005675
6 0.00317325
7 0.00008725
9 0.0000925
2 5
2 0.02396475
5 0.00045075
6 0.008391
7 0.00161075
9 0.00033725
3 4
2 0.0260415
6 0.0210125
7 0.011682
9 0.00092125
4 5
2 0.01287525
4 0.00007425
6 0.02698525
7 0.02130875
9 0.0012565
5 7
2 0.008697
3 0.00012475
5 0.012641
6 0.00643825
7 0.0332455
9 0.00116475
11 0.00018875
如何使用 python 以所需的方式重新排列这些数据
解决方案
这是转换数据的一种方法。
from io import StringIO
import pandas as pd
# copy data from original post into triple-quoted string
data='''ID Class 1 Class 2 Class 3 Class 4 Class 5 Class 6 Class 7 Class 8 Class 9 Class 10 Class 11 Class 12 Class 13
1 0 0.0013865 0 0 0.0005675 0.00317325 0.00008725 0 0.0000925 0 0 0 0
2 0 0.02396475 0 0 0.00045075 0.008391 0.00161075 0 0.00033725 0 0 0 0
3 0 0.0260415 0 0 0 0.0210125 0.011682 0 0.00092125 0 0 0 0
4 0 0.01287525 0 0.00007425 0 0.02698525 0.02130875 0 0.0012565 0 0 0 0
5 0 0.008697 0.00012475 0 0.012641 0.00643825 0.0332455 0 0.00116475 0 0.00018875 0 0
'''
现在分三步处理数据:
# create data frame
df = pd.read_csv(StringIO(data), sep='\s\s+', engine='python', index_col='ID')
# convert 'Class n' to 'n' (with type integer)
df.columns = df.columns.str.replace('Class ', '').astype(int).rename('class_num')
# re-shape, filter, sort, rename
df = df.stack().loc[lambda x: x > 0].sort_index().rename('area')
# UPDATE: count of IDs with non-zero area
t = df.groupby(level=0).transform('count').rename('non-zero-count')
df = pd.concat([df, t], axis=1)
# show first 10 rows
df.head(10)
area non-zero-count
ID class_num
1 2 0.001386 5
5 0.000567 5
6 0.003173 5
7 0.000087 5
9 0.000092 5
2 2 0.023965 5
5 0.000451 5
6 0.008391 5
7 0.001611 5
9 0.000337 5
推荐阅读
- rust - trait impl 的委派只能在夜间进行?
- node.js - 检查该值是否是模型续集中的电话号码
- python - 无法在 plotly express 中从 hover_data 中删除 id 和 label
- python - python读取文件并输出为格式字符串
- javascript - node.js 和 pug 中用户单击按钮和删除前一个问题时如何显示新问题?
- php - 我们应该将 laravel hasone 关系 return null 替换为对象数组吗?
- python - 关于tf2_ros与python3的兼容性问题?
- json - 在swift 5中访问嵌套字典json
- python - 与 SubsetRandomSampler 相关
- python - 如何找到包含一组给定点的函数?