【问题标题】:Get the number index through boolean opearator in python-pandas通过python-pandas中的布尔运算符获取数字索引
【发布时间】:2016-10-29 01:52:54
【问题描述】:

现在我可以使用布尔运算符获得预期值:

mask1 = df.val > 10
mask2 = df.val < 5
c1 = df[mask1]
c2 = df[mask2]

我希望得到c1c2中每个点之间的切片,即给定一个数据框df如下:

       val
0       9
1      12
2       5
3       2
4       11
5       9
6       9
7       3

df[1:3]df[4:7] 的切片是我想要的。首先,我需要通过mask1mask2获取索引1347。你知道怎么做吗?

【问题讨论】:

    标签: python pandas indexing dataframe conditional-statements


    【解决方案1】:

    我认为你可以使用:

    c1 = df[mask1].index
    c2 = df[mask2].index
    
    print (c1)
    Int64Index([1, 4], dtype='int64')
    print (c2)
    Int64Index([3, 7], dtype='int64')
    
    print (df[c1[0]:c2[0]])
       val
    1   12
    2    5
    
    print (df[c1[1]:c2[1]])
       val
    4   11
    5    9
    6    9
    

    同理:

    print (df[1:3])
       val
    1   12
    2    5
    
    print (df[4:7])
       val
    4   11
    5    9
    6    9
    

    如果您需要按c1c2 切片,请使用ix

    print (df.ix[c1])
       val
    1   12
    4   11
    
    print (df.ix[c2])
       val
    3    2
    7    3
    

    【讨论】:

    • 感谢您的回答!我想知道我可以直接执行df[c1] 之类的操作来获取12, 11 的值吗?
    • 您需要添加ixlocprint (df.ix[c1]) 返回val 1 12 4 11 顺便说一句,ix 更快。
    • 那列呢? df.ix[c1, 'val'] ?
    • 是的,它也适用于列 nice df.ix[c1, 'val'],然后得到 Serie,而不是 DataFrame
    【解决方案2】:

    这假设对你有用:

    c1 = df[df['val'] > 10].index.tolist()
    c2 = df[df['val'] < 5].index.tolist()
    

    输出:c1 = [1,4] c2 = [3,7]

    【讨论】:

      【解决方案3】:

      通过该掩码条件将较大的数据帧设置为较小的数据帧

      df_mask1 = df[df.val > 10]
      #in df_mask1  you will have index 1 and 4 [Rows of main dataframe]
      #similarly
      df_mask2  = df[df.val < 5] 
      # you will have index 3 and 7 in df_mask2  
      

      或者,如果您想通过该掩码条件更改其他列值,您可以使用 df.loc(只需尝试在网络上搜索)。

      【讨论】:

        猜你喜欢
        • 2014-02-20
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多