Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按列选择并删除列_Python_Pandas - Fatal编程技术网

Python 按列选择并删除列

Python 按列选择并删除列,python,pandas,Python,Pandas,从数据帧的一列中选择一个特定的值似乎是一种非常常见的活动,这会使该列变得多余。我总是在之后立即明确地删除该列 这在布尔列中尤其明显: In [58]: countries = ['X', 'Y', 'Z']; sectors = ['A', 'B', 'C'] In [59]: ch = np.random.choice In [61]: df = pd.DataFrame(dict(c=ch(countries, 100), s1=ch(sectors, 100), s2=ch(sectors

从数据帧的一列中选择一个特定的值似乎是一种非常常见的活动,这会使该列变得多余。我总是在之后立即明确地删除该列

这在布尔列中尤其明显:

In [58]: countries = ['X', 'Y', 'Z']; sectors = ['A', 'B', 'C']
In [59]: ch = np.random.choice
In [61]: df = pd.DataFrame(dict(c=ch(countries, 100), s1=ch(sectors, 100), s2=ch(sectors, 100), is_good=ch([True, False], 100), val1=np.random.random(100), val2=np.random.random(100)))
In [62]: df.head()
Out[62]: 
   c is_good s1 s2      val1      val2
0  Z    True  B  B  0.694949  0.145197
1  X    True  A  A  0.319551  0.548003
2  X   False  A  C  0.946967  0.220035
3  X   False  B  A  0.998087  0.902530
4  Y   False  B  C  0.303517  0.660556
我现在只想与好的价值观一起工作,所以我做到了:

In [30]: df[df.is_good].drop('is_good', axis=1).head()
Out[30]: 
   c s1 s2      val1      val2
0  Y  B  C  0.265542  0.410853
2  Z  C  C  0.216049  0.407230
4  Z  B  C  0.209100  0.856136
5  X  B  B  0.351570  0.461769
7  X  A  B  0.516026  0.209944
但感觉应该有一种方法来做到这一点,而不需要明确地放弃它。你可以做:

In [31]: df.set_index('is_good').ix[True].head()
Out[31]: 
         c s1 s2      val1      val2
is_good                             
True     Y  B  C  0.265542  0.410853
True     Z  C  C  0.216049  0.407230
True     Z  B  C  0.209100  0.856136
True     X  B  B  0.351570  0.461769
True     X  A  B  0.516026  0.209944
我真的很喜欢它的感觉,但是它的索引很混乱

我也很想做:

In [42]: df.groupby('is_good').get_group(True).head()
Out[42]: 
   c is_good s1 s2      val1      val2
0  Y    True  B  C  0.265542  0.410853
2  Z    True  C  C  0.216049  0.407230
4  Z    True  B  C  0.209100  0.856136
5  X    True  B  B  0.351570  0.461769
7  X    True  A  B  0.516026  0.209944
但是好专栏还在那里


我错过了什么吗?

这里有一种方法。其想法是建立一个多级索引,并使用.xs进行选择,将自动降低一级

df.set_index('is_good', append=True).xs(True, level='is_good')

    c s1 s2    val1    val2
0   Z  A  B  0.1352  0.9529
3   X  A  A  0.5531  0.5571
8   Y  B  C  0.7401  0.0288
12  Y  B  B  0.4117  0.3606
16  X  C  A  0.7138  0.7112
18  Y  C  C  0.6342  0.3654
26  Y  C  A  0.9927  0.9493
28  Z  C  B  0.6059  0.5674
.. .. .. ..     ...     ...
80  Z  B  A  0.2772  0.1103
83  Y  C  B  0.6060  0.7179
85  Z  B  B  0.2914  0.3398
86  X  A  B  0.4753  0.0029
91  Y  B  A  0.9477  0.5383
92  X  B  B  0.9784  0.9479
95  Y  A  C  0.1813  0.9646
96  Y  B  B  0.8365  0.2424

[45 rows x 5 columns]

那太好了。它通过了我在OP中提到的感觉正确的测试。