比较两个数据帧并根据查找表删除列

时间:2018-08-05 02:12:27

标签: python python-3.x pandas dataframe

我有两个数据框:

df1:

    A   B   C   D   E   F
0   63  9   56  23  41  0
1   40  35  69  98  47  45
2   51  95  55  36  10  34
3   25  11  67  83  49  89
4   91  10  43  73  96  95
5   2   47  8   30  46  9
6   37  10  33  8   45  20
7   40  88  6   29  46  79
8   75  87  49  76  0   69
9   92  21  86  91  46  41

df2:

    A   B   C   D   E   F
0   0   0   0   1   1   0

我想基于df2(查找表)中的值删除df1中的列。 df2有1的任何地方,我都必须删除df1中的该列。

所以我的最终输出应该是这样。

    A   B   C   F
0   63  9   56  0
1   40  35  69  45
2   51  95  55  34
3   25  11  67  89
4   91  10  43  95
5   2   47  8   9
6   37  10  33  20
7   40  88  6   79
8   75  87  49  69
9   92  21  86  41

4 个答案:

答案 0 :(得分:1)

假设len(df1.columns) == len(df2.columns)

df1.loc[:, ~df2.loc[0].astype(bool).values]

    A   B   C   F
0  63   9  56   0
1  40  35  69  45
2  51  95  55  34
3  25  11  67  89
4  91  10  43  95
5   2  47   8   9
6  37  10  33  20
7  40  88   6  79
8  75  87  49  69
9  92  21  86  41

如果列不相同,但是df2df1中有列的子集,则

df1.reindex(df2.columns[~df2.loc[0].astype(bool)], axis=1)

或使用drop,类似于@student的方法:

df1.drop(df2.columns[df2.loc[0].astype(bool)], axis=1)

    A   B   C   F
0  63   9  56   0
1  40  35  69  45
2  51  95  55  34
3  25  11  67  89
4  91  10  43  95
5   2  47   8   9
6  37  10  33  20
7  40  88   6  79
8  75  87  49  69
9  92  21  86  41

答案 1 :(得分:1)

列可以做intersection

df1[df1.columns.intersection(df2.columns[~df2.iloc[0].astype(bool)])]
Out[354]: 
    A   B   C   F
0  63   9  56   0
1  40  35  69  45
2  51  95  55  34
3  25  11  67  89
4  91  10  43  95
5   2  47   8   9
6  37  10  33  20
7  40  88   6  79
8  75  87  49  69
9  92  21  86  41

答案 2 :(得分:0)

您可以尝试使用drop删除列:

remove_col = df2.columns[(df2 == 1).any()] # get columns with any value 1
df1.drop(remove_col, axis=1, inplace=True) # drop the columns in original dataframe

或者,在一行中为:

df1.drop(df2.columns[(df2 == 1).any()], axis=1, inplace=True)

答案 3 :(得分:0)

以下可能是一个易于理解的解决方案:

df1.loc[:,df2.loc[0]!=1]

输出:

    A   B   C   F
0  63   9  56   0
1  40  35  69  45
2  51  95  55  34
3  25  11  67  89
4  91  10  43  95
5   2  47   8   9
6  37  10  33  20
7  40  88   6  79
8  75  87  49  69
9  92  21  86  41

loc可用于选择具有布尔或条件查找的行或列:https://www.shanelynn.ie/select-pandas-dataframe-rows-and-columns-using-iloc-loc-and-ix/