熊猫系列过滤器DataFrame

时间:2019-11-09 11:55:24

标签: python pandas dataframe

我有一个熊猫系列,内容如下。

$ 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具有ABCD作为索引。 df的列名称为ABCDE

True中的

filter表示df中的相应列将被保留。 False中的filter表示df中的相应列将被删除。 E中的df列应删除,因为filter不包含E

如何生成具有B列并使用E删除了filter的另一个DataFrame?

我的意思是我想使用filterdf创建以下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中的哪些元素。

1 个答案:

答案 0 :(得分:1)

这应该给您您所需要的:

df.loc[:, filter[filter].index]

说明:您在filter中选择包含True的行,并使用其index标签从df中选择列。

您不能直接使用filter中的布尔值,因为它包含的值少于df中的列。