Python 根据条件从任意列/行中选择值
我有一个数据帧形式的相关矩阵。比如:Python 根据条件从任意列/行中选择值,python,pandas,Python,Pandas,我有一个数据帧形式的相关矩阵。比如: xyz abc def xyz 1 0.1 -0.2 abc 0.1 1 0.3 def -0.2 0.3 1 df[df>value] or 我需要能够选择高于或低于某个阈值的所有值,但它们当然可以在任何行或列中 例如,选择高于0.2的所有值。有两个结果: (def,abc)和(abc,def) 我不知道该怎么做,因为它涉及到根据每一行/每一列中的条件搜索值。理想情况下,输出应采用易于
xyz abc def
xyz 1 0.1 -0.2
abc 0.1 1 0.3
def -0.2 0.3 1
df[df>value] or
我需要能够选择高于或低于某个阈值的所有值,但它们当然可以在任何行或列中
例如,选择高于0.2的所有值。有两个结果:
(def,abc)和(abc,def)
我不知道该怎么做,因为它涉及到根据每一行/每一列中的条件搜索值。理想情况下,输出应采用易于识别对的格式(例如:元组列表或类似的格式)
编辑:哦,当然所有相同的列/行也会出现在上述示例的结果中(即:xyz/xyz,abc/abc,def/def)将((行,列),val)的二维到一维元组展平。按val排序。检索val>0.2的元组(行、列)假设您的数据帧为“df”,阈值为“value”,您可以执行以下操作:
xyz abc def
xyz 1 0.1 -0.2
abc 0.1 1 0.3
def -0.2 0.3 1
df[df>value] or
df[df>值].dropna(axis=1,how=“all”)
如果要删除不匹配的列。这里有一种方法,使用np.triu
屏蔽上三角矩阵,并通过堆栈重塑相关矩阵
import pandas as pd
import numpy as np
# simulate some data to generate corr_mat
# ==============================================
np.random.seed(0)
data = np.random.multivariate_normal([0,0,0], [[1,0.1,-0.2],[0.1,1,0.3],[-0.2,0.3,1]], 10000)
df = pd.DataFrame(data, columns='xyz abc def'.split())
corr_mat = df.corr()
corr_mat
xyz abc def
xyz 1.0000 0.1216 -0.1901
abc 0.1216 1.0000 0.3014
def -0.1901 0.3014 1.0000
# processing
# =======================================
# mask on lower-triangle only
mask = np.ones_like(corr_mat, dtype=np.bool)
mask[np.triu_indices_from(mask)] = False
mask
array([[False, False, False],
[ True, False, False],
[ True, True, False]], dtype=bool)
# reshape the correlation matrix, and select corr > 0.2
corr_stacked = corr_mat.stack()
corr_stacked[(corr_stacked > 0.2) & (mask.ravel())]
def abc 0.3014
dtype: float64
# you can reset_index to put multi-level index to columns
但是值1
不也高于0.2
?所以你不想选那个?我会先在水平线上循环,然后在垂直线上循环。实际上我不想要那个。但是,如果它们包含在元组列表中,我就可以在此时过滤掉它们。我正在努力解决的部分是从数据帧中获取值。谢谢,我已经完成了创建循环结构的工作。我希望有一种矢量化的方法来实现它,而不需要循环,因为这样通常更快(我的数据帧很大)。不过,这至少在目前是可行的。谢谢,这听起来似乎会奏效,但我不确定如何获得1d元组((行,列),val)。我已经尝试将list(df.itertuples())转换为dict(*args,**kwargs)将数据帧转换为字典。