看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
用 Excel 制作表格时,有时会将多个信息多列显示,左边为属性右边为数据,但同时我们又希望将这类数据转为 DataFrame,按照 DataFrame 的规范,所有表头应该在列索引上,这就需要我们进行一下转换。
我们假定从一个 Excel 读取到一个数据,数据的表头在列上,如:
import pandas as pd
import io
data = '''
姓名 张三 年龄 18
性别 男
'''
df = pd.read_csv(io.StringIO(data),
sep=r'\s+',
header=None)
df
'''
0 1 2 3
0 姓名 张三 年龄 18.0
1 性别 男 NaN NaN
'''
数据中,姓名、年龄、性别都在列上,同时第二行还存在缺失值。我们需要将这个数据经过处理,所有表头在列索引上,即:
'''
姓名 年龄 性别
0 张三 18.0 男
'''
先将读取到的 DataFrame 的所有值转为一个平铺的 NumPy array 类型,它是一个一维数据,然后再用 reshape() 转为 N 行 2 列,这里的 N 可以通过 DataFrame 的列数计算。
接着将变形后的 array 读入 DataFrame,然后经过一系列转置、删除缺失值、设置索引等操作,得到最终的数据。
将数据转换变形测试代码:
df.values.reshape([4, 2])
'''
array([['姓名', '张三'],
['年龄', 18.0],
['性别', '男'],
[nan, nan]], dtype=object)
'''
最终的代码为:
r = len(df.columns)
(
pd.DataFrame(df.values.reshape([r, int(r/2)]))
.T
.dropna(axis=1)
.T
.set_index(0)
.T
)
'''
姓名 年龄 性别
0 张三 18.0 男
'''
这样就完成了需求。
(完)
更新时间:2024-08-18 16:22:15 标签:pandas python 表头 索引