熊猫loc动态条件列表

时间:2019-02-14 09:54:31

标签: python python-3.x pandas

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

Sample data

例如,查看列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])]

有什么主意吗? 谢谢。

1 个答案:

答案 0 :(得分: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,然后仅在行中的所有值均为{{1}时返回True }。因此,它为获取的每一行返回一个向量True,对于其他行返回一个向量True

如果要提供任意阈值,可以将False求和并除以列数-1,然后与阈值进行比较:

Trues