【问题标题】:Pandas Python, select columns based on rows conditionsPandas Python,根据行条件选择列
【发布时间】:2016-11-02 05:05:48
【问题描述】:

我有一个数据框:

import pandas as pd
df = pd.DataFrame(np.random.randn(2, 4))
print(df)
          0         1         2         3
0  1.489198  1.329603  1.590124  1.123505
1  0.024017  0.581033  2.500397  0.156280

我想选择至少有一行值大于2 的列。我尝试了以下方法,但没有按预期工作。

df[df.columns[df.iloc[(0,1)]>2]]

在这个玩具示例中,我的预期输出是:

       2
1.590124  
2.500397 

【问题讨论】:

    标签: python pandas dataframe conditional-statements


    【解决方案1】:

    使用gtany 过滤df:

    In [287]:
    df.ix[:,df.gt(2).any()]
    
    Out[287]:
              2
    0  1.590124
    1  2.500397
    

    这里我们使用ix选择所有行,第一个:和下一个arg是满足条件的列的布尔掩码:

    In [288]:
    df.gt(2)
    
    Out[288]:
           0      1      2      3
    0  False  False  False  False
    1  False  False   True  False
    
    In [289]:
    df.gt(2).any()
    
    Out[289]:
    0    False
    1    False
    2     True
    3    False
    dtype: bool
    

    在您的示例中,您所做的是选择第一行和第二列的单元格值,然后您尝试使用它来掩盖列,但这只是返回了第一列,因此它为什么不起作用:

    In [291]:
    df.iloc[(0,1)]
    
    Out[291]:
    1.3296030000000001
    
    In [293]:
    df.columns[df.iloc[(0,1)]>2]
    
    Out[293]:
    '0'
    

    【讨论】:

    • 好的,谢谢你们,有人知道我的脚本应该做什么吗?
    • this df.iloc[(0,1)] 选择了第一行和第二列的单元格值并测试它是否大于 2,否则它不会工作
    • 感谢 EdChum 的回答
    • EdChum,如果我想选择至少一行低于特定值或等于特定值的列怎么办?或者如何反转布尔条目的数据框?
    • 如果您愿意,请使用 le<=
    【解决方案2】:

    使用df > 2创建的maskany,然后通过ix选择列:

    import pandas as pd
    np.random.seed(18)
    df = pd.DataFrame(np.random.randn(2, 4))
    print(df)
              0         1         2         3
    0  0.079428  2.190202 -0.134892  0.160518
    1  0.442698  0.623391  1.008903  0.394249
    
    print ((df>2).any())
    0    False
    1     True
    2    False
    3    False
    dtype: bool
    
    print (df.ix[:, (df>2).any()])
              1
    0  2.190202
    1  0.623391
    

    通过评论编辑:

    您可以按部分检查您的解决方案:

    它似乎有效,但它总是选择第二列(1,python 计数来自0)列如果条件True

    print (df.iloc[(0,1)])
    2.19020235741
    
    print (df.iloc[(0,1)] > 2)
    True
    
    print (df.columns[df.iloc[(0,1)]>2])
    1
    
    print (df[df.columns[df.iloc[(0,1)]>2]])
    0    2.190202
    1    0.623391
    Name: 1, dtype: float64
    

    如果False 是第一列(0),因为布尔值TrueFalse 被强制转换为10

    np.random.seed(15)
    df = pd.DataFrame(np.random.randn(2, 4))
    print (df)
              0         1         2         3
    0 -0.312328  0.339285 -0.155909 -0.501790
    1  0.235569 -1.763605 -1.095862 -1.087766
    
    print (df.iloc[(0,1)])
    0.339284706046
    
    print (df.iloc[(0,1)] > 2)
    False
    
    print (df.columns[df.iloc[(0,1)]>2])
    0
    
    print (df[df.columns[df.iloc[(0,1)]>2]])
    0   -0.312328
    1    0.235569
    Name: 0, dtype: float64
    

    如果更改列名:

    np.random.seed(15)
    df = pd.DataFrame(np.random.randn(2, 4))
    df.columns = ['a','b','c','d']
    print (df)
              a         b         c         d
    0 -0.312328  0.339285 -0.155909 -0.501790
    1  0.235569 -1.763605 -1.095862 -1.087766
    
    print (df.iloc[(0,1)] > 2)
    False
    
    print (df[df.columns[df.iloc[(0,1)]>2]])
    0   -0.312328
    1    0.235569
    Name: a, dtype: float64
    

    【讨论】:

    • 好的,谢谢你们,有人知道我的脚本应该做什么吗?
    • 我尝试通过示例来解释,请检查。
    【解决方案3】:

    快速更新,因为 .ix 现在已弃用(自 0.20.0 起)。对于最新版本的 pandas,.loc 可以解决问题:

    df.loc[:, df.gt(2).any()]
    

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2023-03-14
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多