根据值在 Python 中查找 Pandas 数据框列
Find Pandas dataframe column based on values, in Python
我在 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。
我需要做以下事情:
- 在 Dataframe (
df
) 中查找所有行中 仅 1 的列的名称。
- 从
df
中删除该列
- 从
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
有办法吗?
您可以使用 DataFrame.apply
和 axis=0
将函数应用于数据框的每一列。在您的情况下,您想检查每列是否 all(col==1)
。
然后你可以使用列表理解来挑选列,最后使用 DataFrame.drop
删除列:
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
returns 一个系列,每列都有布尔值:
In [124]:
(df==1).all()
Out[124]:
A True
B False
C False
dtype: bool
然后您可以使用它来屏蔽 return 您希望从 df2
中删除的列,如上所示。
我在 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。
我需要做以下事情:
- 在 Dataframe (
df
) 中查找所有行中 仅 1 的列的名称。 - 从
df
中删除该列
- 从
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
有办法吗?
您可以使用 DataFrame.apply
和 axis=0
将函数应用于数据框的每一列。在您的情况下,您想检查每列是否 all(col==1)
。
然后你可以使用列表理解来挑选列,最后使用 DataFrame.drop
删除列:
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
returns 一个系列,每列都有布尔值:
In [124]:
(df==1).all()
Out[124]:
A True
B False
C False
dtype: bool
然后您可以使用它来屏蔽 return 您希望从 df2
中删除的列,如上所示。