【问题标题】:Pandas loc dynamic conditional listPandas loc 动态条件列表
【发布时间】:2019-02-14 09:54:30
【问题描述】:

我有一个 Pandas DataFrame,我想找到第 i 列值比其他列大 10 倍的所有行。 这是我的 DataFrame 的一个示例:

例如,查看 i=0 列,B 行 (0.344),它比同一行但其他列 (0.001, 0, 0.009, 0) 中的值大 10 倍。所以我想:

my_list_0=[False,True,False,False,False,False,False,False,False,False,False]

列数可能会改变,因此我不想要这样的解决方案:

#This is good only for a DataFrame with 4 columns.
my_list_i = data.loc[(data.iloc[:,i]>10*data.iloc[:,(i+1)%num_cols]) &
                     (data.iloc[:,i]>10*data.iloc[:,(i+2)%num_cols]) &
                     (data.iloc[:,i]>10*data.iloc[:,(i+3)%num_cols])]

有什么想法吗? 谢谢。

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    鉴于df:

    df = pd.DataFrame({'cell1':[0.006209, 0.344955, 0.004521, 0, 0.018931, 0.439725, 0.013195, 0.009045, 0, 0.02614, 0],
                  'cell2':[0.048043, 0.001077, 0,0.010393, 0.031546, 0.287264, 0.016732, 0.030291, 0.016236, 0.310639,0], 
                  'cell3':[0,0,0.020238, 0, 0.03811, 0.579348, 0.005906, 0,0,0.068352, 0.030165],
                  'cell4':[0.016139, 0.009359, 0,0,0.025449, 0.47779, 0, 0.01282, 0.005107, 0.004846, 0],
                  'cell5': [0,0,0,0.012075, 0.031668, 0.520258, 0,0,0,2.728218, 0.013418]})
    i = 0
    

    你可以使用

    (10 * df.drop(df.columns[i], axis=1)).lt(df.iloc[:,i], axis=0).all(1)
    

    得到

    0     False
    1      True
    2     False
    3     False
    4     False
    5     False
    6     False
    7     False
    8     False
    9     False
    10    False
    dtype: bool
    

    对于任意数量的列。这将删除列i,将剩余的df 乘以10,并逐行检查是否小于i,然后仅当行中的所有值都是True 时才返回True。因此,它为获得的每一行返回一个True 的向量,并为其他行返回一个False

    如果要给出任意阈值,可以将Trues 相加并除以列数 - 1,然后与您的阈值进行比较:

    thresh = 0.5  # or whatever you want
    (10 * df.drop(df.columns[i], axis=1)).lt(df.iloc[:,i], axis=0).sum(1) / (df.shape[1] - 1) > thresh
    
    0     False
    1      True
    2      True
    3     False
    4     False
    5     False
    6     False
    7     False
    8     False
    9     False
    10    False
    dtype: bool
    

    【讨论】:

    • 我不知道它是如何工作的(检查 i 列和其他每一列)。
    • sum(1) 对每一行求和。你为什么不检查一下看看?
    • 我确实检查过,因此问。条件转换为 df.iloc[:,i] > 10*sum_of_row。这不会检查 df.iloc[:,i] 是否更明智。我错过了什么吗?
    • 已编辑,以后请复制粘贴代码而不是图像,因为这样可以避免人们不得不从头开始重新输入以进行复制。
    • 顺便说一句 - 在 .any() 和 .all() 之间是否有 Pandas 运算符? (即当某些百分比的列满足条件时为真)。我想我可以在 df.drop 之后使用 df.sample(frac=0.5,axis=1) 来做到这一点。
    猜你喜欢
    • 2021-11-15
    • 2019-11-15
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2018-02-17
    • 2018-01-29
    • 2020-11-14
    • 2022-01-07
    相关资源
    最近更新 更多