看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
大多数据情况下,选择和处理的数据是一个矩形区域,或者是一个标量。在本例中,我们需要处理的数据为源数据中的三角形部分。
我们的源数据如下:
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
'''
可以用 for 循环来进行赋值修改:
import pandas as pd
# 创建一个对称矩阵
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
'''
for i in range(3):
for j in range(i + 1):
df.iloc[i, j] = None
df
'''
A B C
0 NaN 4.0 7.0
1 NaN NaN 8.0
2 NaN NaN NaN
'''
这样就完成了这个需求。
(完)
更新时间:Aug. 18, 2024, 4:11 p.m. 标签:pandas python 对角线