【问题标题】:Find Pandas dataframe column based on values, in Python在 Python 中根据值查找 Pandas 数据框列
【发布时间】:2015-06-02 02:56:21
【问题描述】:

我在 Python 中有 2 个 Pandas 数据框。他们在这里:

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。

我需要做以下事情:

  1. 在所有行中包含 1 的 Dataframe (df) 中查找列的名称。
  2. df 中删除该列
  3. df2 中删除 SAME

我想得到这个:

          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

有没有办法做到这一点?

【问题讨论】:

    标签: python-2.7 pandas multiple-columns


    【解决方案1】:

    您可以使用DataFrame.applyaxis=0 将函数应用于数据帧的每一列。在您的情况下,您想检查每列是否有all(col==1)。 然后你可以使用列表推导来挑选列,最后使用DataFrame.drop do drop the columns:

    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)
    

    【讨论】:

    • 不使用列表推导式,可以使用allonecols系列.loc:df2.loc[:, ~ allonecols]
    • 不错的 marius,从没想过使用 loc 来索引列。
    • 感谢您的回复。
    【解决方案2】:

    我建议在整个 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 删除的列,如上所示。

    【讨论】:

    • 我将此标记为答案。不过maxymoo的反响也很好。
    • 虽然 maxymoo 的回答是正确的,但如果有一种矢量化方法并且可以对整个 df 进行操作,那么通常应该避免使用apply
    • 谢谢。我刚开始发现他的答案更容易理解,因为我更熟悉列表理解。我现在明白你的意思了。
    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 2021-05-15
    • 2021-06-17
    • 2023-03-28
    • 2021-07-22
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多