pandas
python
对角线
看过来
《pandas 教程》 持续更新中,可作为 pandas 入门进阶课程、pandas 中文手册、用法大全,配有案例讲解和速查手册。提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。查看更新日志。作者开办 Python 数据分析培训,详情 Python 数据分析培训。
![]() |
本教程作者所著新书《深入浅出Pandas:利用Python进行数据处理与分析》(ISBN:9787111685456)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
大多数据情况下,选择和处理的数据是一个矩形区域,或者是一个标量。在本例中,我们需要处理的数据为源数据中的三角形部分。
我们的源数据如下:
import pandas as pd
import numpy as np
# 创建一个对称矩阵
df = pd.DataFrame({'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]})
df
'''
A B C
0 1 4 7
1 2 5 8
2 3 6 9
'''
假设以上数据有一个左上到右下的对角线,现在希望保留这个对角线上方的数据,即 4、7、8,其余修改为缺失值。
用 NumPy 的相关函数构造一个上三角矩阵,然后通过对比获得一个布尔矩阵,最后用 DataFrame 的 mask() 方法将不需要的值修改为缺失值。
NumPy 的 triu() 函数将源数据对角线下方的值设置为 0,其余的值保留:
np.triu(df)
'''
array([[1, 4, 7],
[0, 5, 8],
[0, 0, 9]])
'''
返回的是一个 ndarry,设置 k 值为 1,将设置为 0 的区域上移一步:
np.triu(df, 1)
'''
array([[0, 4, 7],
[0, 0, 8],
[0, 0, 0]])
'''
由于其余值为 0,向量化判断数组为 0,得到一个布尔数组:
np.triu(df, 1)==0
'''
array([[ True, False, False],
[ True, True, False],
[ True, True, True]])
'''
最后,源数据的 mask() 方法来以掩码的逻辑将同形状布尔数组的 True 值为缺失值:
df.mask(np.triu(df, 1)==0)
'''
A B C
0 NaN 4.0 7.0
1 NaN NaN 8.0
2 NaN NaN NaN
'''
这样就完成了这个需求。
(完)