我从一个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的那些列。但它已经失败了第一步。
对正确方向的暗示将不胜感激。
答案 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)