根据行值保留数据框列

时间:2015-03-18 14:56:30

标签: python pandas

我从一个pandas数据帧pm开始。它由多个列和行组成,其中一行允许调用它'active'包含字符串'True'或字符串'False'。例如,它看起来像这样:

import pandas as pd
pm = pd.DataFrame(data={'peter': [17, 'True'],
                        'susan': [14, 'False'],
                        'tom': [1, 'False'],
                        'jenny': [12, 'True']},
                  index=['some_number', 'active'])

看起来像这样:

Out[60]: 
            jenny peter  susan    tom
some_number    12    17     14      1
active       True  True  False  False

我想要的只是保留那些列'active'包含的值设置为'True'的列。弦也应该铸成bools。对于此示例,我希望数据框看起来像这样:

desired = pd.DataFrame(data={'peter': [17, True],
                             'jenny': [12, True]},
                       index=['some_number', 'active'])

这一定非常非常简单,但由于我是熊猫新手,我目前正在努力解决这个问题。我想到了两个步骤:

1)将整行投入bool,但当我尝试这样做时,所有内容都设置为True

pm.loc['active',:] = pm.loc['active',:].astype(bool)

但它看起来像这样:

Out[61]: 
            jenny peter susan   tom
some_number    12    17    14     1
active       True  True  True  True

2)在第二步中,仅保留行'active'中的值为true的那些列。但它已经失败了第一步。

对正确方向的暗示将不胜感激。

1 个答案:

答案 0 :(得分:2)

我首先用调用replace的布尔等价替换字符串值,然后可以使用标签索引来选择该行,生成一个布尔值系列,其值等于True并使用这可以选择列:

In [226]:

pm.replace('True',True, inplace=True)
pm.replace('False',False,inplace=True)
In [228]:

pm[pm.columns[pm.loc['active'] == True]]

Out[228]:
            jenny peter
some_number    12    17
active       True  True

突破以上:

In [229]:

pm.loc['active'] == True
Out[229]:
jenny     True
peter     True
susan    False
tom      False
Name: active, dtype: bool
In [230]:

pm.columns[pm.loc['active'] == True]
Out[230]:
Index(['jenny', 'peter'], dtype='object')

修改

正如@DSM所指出的那样,你可以使用这样的事实:因为这些值现在是真正的bool,那么你可以用它来选择列:

In [234]:

pm.loc[:,pm.loc["active"]]
Out[234]:
            jenny peter
some_number    12    17
active       True  True

另一个更新

如果您担心在整个df上调用替换,那么您可以在该行上调用replace

pm.loc['active'].replace('True',True, inplace=True)
pm.loc['active'].replace('False',False,inplace=True)