Python 2.7 在Python中基于值查找dataframe列

Python 2.7 在Python中基于值查找dataframe列,python-2.7,pandas,multiple-columns,Python 2.7,Pandas,Multiple Columns,我有两个Python数据帧。这是: import numpy as np import pandas as pd df = pd.DataFrame(np.random.rand(10,3),columns=list('ABC')) df2 = pd.DataFrame(np.random.rand(10,3),columns=list('ABC')) df['A'] = 1 print df print df2 A B C 0 1 0.333141

我有两个Python数据帧。这是:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10,3),columns=list('ABC'))
df2 = pd.DataFrame(np.random.rand(10,3),columns=list('ABC'))
df['A'] = 1
print df
print df2

   A         B         C
0  1  0.333141  0.803991
1  1  0.043958  0.582038
2  1  0.833433  0.782856
3  1  0.722592  0.237912
4  1  0.634979  0.664208
5  1  0.809748  0.889524
6  1  0.110342  0.650617
7  1  0.035417  0.251089
8  1  0.481492  0.128792
9  1  0.190135  0.213608

          A         B         C
0  0.897373  0.599721  0.361668
1  0.495024  0.471351  0.090395
2  0.651174  0.621328  0.721208
3  0.253459  0.567619  0.104370
4  0.357627  0.616717  0.775327
5  0.164323  0.716166  0.740565
6  0.841509  0.464837  0.398952
7  0.398680  0.186555  0.293076
8  0.298785  0.784237  0.704184
9  0.124763  0.384852  0.307361
正如您在
df
中所看到的,有一列只有1

我需要做以下工作:

  • 在数据帧(
    df
    )中查找所有行中仅包含的列的名称
  • df
  • df2
  • 我想得到这个:

              B         C
    0  0.333141  0.803991
    1  0.043958  0.582038
    2  0.833433  0.782856
    3  0.722592  0.237912
    4  0.634979  0.664208
    5  0.809748  0.889524
    6  0.110342  0.650617
    7  0.035417  0.251089
    8  0.481492  0.128792
    9  0.190135  0.213608
    
              B         C
    0  0.599721  0.361668
    1  0.471351  0.090395
    2  0.621328  0.721208
    3  0.567619  0.104370
    4  0.616717  0.775327
    5  0.716166  0.740565
    6  0.464837  0.398952
    7  0.186555  0.293076
    8  0.784237  0.704184
    9  0.384852  0.307361
    

    有什么方法可以做到这一点吗?

    您可以使用
    DataFrame.apply
    axis=0
    将函数应用于DataFrame的每一列。在本例中,您需要检查每列的
    all(col==1)
    。 然后,您可以使用列表理解选择列,最后使用
    DataFrame.drop
    do删除列:

    allonecols = df.apply(lambda col: all(col==1), axis = 0)
    allonecols 
    A     True
    B    False
    C    False
    dtype: bool
    
    dropcols = [k for k,v in allonecols.to_dict().items() if v]  
    dropcols 
    ['A']
    
    df2.drop(dropcols, axis = 1)
    

    我建议对整个df的布尔条件使用
    all
    ,而不是使用
    apply

    In [122]:
    col_to_drop = df.columns[(df==1).all()]
    col_to_drop
    
    Out[122]:
    Index(['A'], dtype='object')
    
    In [123]:    
    df2.drop(col_to_drop, axis=1)
    Out[123]:
              B         C
    0  0.507605  0.134758
    1  0.777054  0.285220
    2  0.121124  0.430874
    3  0.422746  0.775676
    4  0.563303  0.659942
    5  0.582580  0.437603
    6  0.221917  0.339737
    7  0.634779  0.172416
    8  0.703110  0.730759
    9  0.426673  0.923138
    
    对布尔比较调用
    all
    ,返回一个序列,其中每个列都有布尔值:

    In [124]:
    (df==1).all()
    
    Out[124]:
    A     True
    B    False
    C    False
    dtype: bool
    

    然后,您可以使用它来屏蔽列,以返回要从
    df2
    中删除的列,如上所示。

    您可以使用
    .loc
    df2.loc[:,~allonecols]
    中的
    allonecols
    系列,而不是使用列表理解,从未想过使用
    loc
    索引列。感谢您的回复。我将此标记为答案。然而,maxymoo的回答也很好。虽然maxymoo的回答通常是正确的,但如果有一种方法是矢量化的,并且可以对整个df进行操作,则应避免使用
    apply
    ,谢谢。我刚开始觉得更容易理解他的答案,因为我更熟悉列表理解。我现在明白你的意思了。