我有一个熊猫系列,内容如下。
$ import pandas as pd
$ filter = pd.Series(
data = [True, False, True, True],
index = ['A', 'B', 'C', 'D']
)
$ filter.index.name = 'my_id'
$ print(filter)
my_id
A True
B False
C True
D True
dtype: bool
和这样的DataFrame。
$ df = pd.DataFrame({
'A': [1, 2, 9, 4],
'B': [9, 6, 7, 8],
'C': [10, 91, 32, 13],
'D': [43, 12, 7, 9],
'E': [65, 12, 3, 8]
})
$ print(df)
A B C D E
0 1 9 10 43 65
1 2 6 91 12 12
2 9 7 32 7 3
3 4 8 13 9 8
filter
具有A
,B
,C
和D
作为索引。 df
的列名称为A
,B
,C
,D
和E
。
True
中的 filter
表示df
中的相应列将被保留。 False
中的filter
表示df
中的相应列将被删除。 E
中的df
列应删除,因为filter
不包含E
。
如何生成具有B
列并使用E
删除了filter
的另一个DataFrame?
我的意思是我想使用filter
和df
创建以下DataFrame。
A C D
0 1 10 43
1 2 91 12
2 9 32 7
3 4 13 9
df.loc[:, filter]
产生以下错误。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/username/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py", line 1494, in __getitem__
return self._getitem_tuple(key)
File "/Users/username/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py", line 888, in _getitem_tuple
retval = getattr(retval, self.name)._getitem_axis(key, axis=i)
File "/Users/username/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py", line 1869, in _getitem_axis
return self._getbool_axis(key, axis=axis)
File "/Users/username/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py", line 1515, in _getbool_axis
key = check_bool_indexer(labels, key)
File "/Users/username/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py", line 2486, in check_bool_indexer
raise IndexingError('Unalignable boolean Series provided as '
pandas.core.indexing.IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match
如果df.loc[:, filter]
不包含列df
,则 E
有效。
我遇到的DataFrame(len(df.columns)
)的实际长度包含大约2000列。该系列(len(filter)
)的长度约为1999年。这使我很难确定df
中的哪些元素,而不是filter
中的哪些元素。
答案 0 :(得分:1)
这应该给您您所需要的:
df.loc[:, filter[filter].index]
说明:您在filter
中选择包含True
的行,并使用其index
标签从df
中选择列。
您不能直接使用filter
中的布尔值,因为它包含的值少于df
中的列。