【问题标题】:Select values from any column/row based on criteria根据条件从任何列/行中选择值
【发布时间】:2015-07-31 16:07:48
【问题描述】:

我有一个数据框形式的相关矩阵。比如:

       xyz   abc  def
xyz    1     0.1  -0.2
abc    0.1   1    0.3
def    -0.2  0.3  1

我需要能够选择高于或低于某个阈值的所有值,但当然它们可以在任何行或列中。

例如,选择所有大于 0.2 的值。有两个结果:

(def,abc) 和 (abc,def)

我不确定如何执行此操作,因为它涉及根据每行/列中的条件搜索值。理想情况下,输出应采用易于识别对的格式(例如:元组列表或类似的东西)

编辑:哦,当然所有相同的列/行也会出现在上述示例的结果中(即:xyz/xyz、abc/abc、def/def)

【问题讨论】:

  • 但是1的值不是也高于0.2吗?所以你不想选择那个?
  • 我会先在水平线上循环,然后在那个循环中你在垂直线上循环。
  • 我其实不想要那些。但是,如果它们包含在元组列表中,那么我可以在那时将它们过滤掉。我苦苦挣扎的部分是从数据框中获取值。
  • 谢谢,我已经创建了循环结构来解决问题。我希望有一种矢量化的方式来做到这一点而无需循环,因为这通常更快(我的数据框很大)。然而,这至少目前有效。

标签: python pandas


【解决方案1】:

这是使用np.triu 屏蔽上三角矩阵并通过stack 重塑相关矩阵的一种方法。

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

【讨论】:

    【解决方案2】:

    将 ((row,col), val) 的 2d 到 1d 元组展平。按 val 排序。检索 (row,col) val > 0.2 的元组

    【讨论】:

    【解决方案3】:

    假设您的数据框是“df”并且您的阈值是“值”,您可以执行以下操作:

    df[df>value] or
    

    df[df>value].dropna(axis=1, how="all") 如果你想删除没有匹配的列。

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 2019-07-30
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2013-12-27
      • 1970-01-01
      相关资源
      最近更新 更多