我有一个DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'foo.aa': [1, 2.1, np.nan, 4.7, 5.6, 6.8], 'foo.fighters': [0, 1, np.nan, 0, 0, 0], 'foo.bars': [0, 0, 0, 0, 0, 1], 'bar.baz': [5, 5, 6, 5, 5.6, 6.8], 'foo.fox': [2, 4, 1, 0, 0, 5], 'nas.foo': ['NA', 0, 1, 0, 0, 0], 'foo.manchu': ['NA', 0, 0, 0, 0, 0],})
我想在以开头的列中选择1的值foo.。除了以下以外,还有更好的方法吗:
foo.
df2 = df[(df['foo.aa'] == 1)| (df['foo.fighters'] == 1)| (df['foo.bars'] == 1)| (df['foo.fox'] == 1)| (df['foo.manchu'] == 1) ]
类似于写类似的东西:
df2= df[df.STARTS_WITH_FOO == 1]
答案应打印出如下所示的DataFrame:
bar.baz foo.aa foo.bars foo.fighters foo.fox foo.manchu nas.foo 0 5.0 1.0 0 0 2 NA NA 1 5.0 2.1 0 1 4 0 0 2 6.0 NaN 0 NaN 1 0 1 5 6.8 6.8 1 0 5 0 0 [4 rows x 7 columns]
只需执行列表推导即可创建您的列:
In [28]: filter_col = [col for col in df if col.startswith('foo')] filter_col Out[28]: ['foo.aa', 'foo.bars', 'foo.fighters', 'foo.fox', 'foo.manchu'] In [29]: df[filter_col] Out[29]: foo.aa foo.bars foo.fighters foo.fox foo.manchu 0 1.0 0 0 2 NA 1 2.1 0 1 4 0 2 NaN 0 NaN 1 0 3 4.7 0 0 0 0 4 5.6 0 0 0 0 5 6.8 1 0 5 0
另一种方法是从列创建序列,并使用向量化str方法startswith:
startswith
In [33]: df[df.columns[pd.Series(df.columns).str.startswith('foo')]] Out[33]: foo.aa foo.bars foo.fighters foo.fox foo.manchu 0 1.0 0 0 2 NA 1 2.1 0 1 4 0 2 NaN 0 NaN 1 0 3 4.7 0 0 0 0 4 5.6 0 0 0 0 5 6.8 1 0 5 0
为了实现您想要的目标,您需要添加以下内容以过滤不符合您的==1条件的值:
==1
In [36]: df[df[df.columns[pd.Series(df.columns).str.startswith('foo')]]==1] Out[36]: bar.baz foo.aa foo.bars foo.fighters foo.fox foo.manchu nas.foo 0 NaN 1 NaN NaN NaN NaN NaN 1 NaN NaN NaN 1 NaN NaN NaN 2 NaN NaN NaN NaN 1 NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN NaN NaN NaN 5 NaN NaN 1 NaN NaN NaN NaN
编辑
看到您想要复杂的答案后,确定为:
In [72]: df.loc[df[df[df.columns[pd.Series(df.columns).str.startswith('foo')]] == 1].dropna(how='all', axis=0).index] Out[72]: bar.baz foo.aa foo.bars foo.fighters foo.fox foo.manchu nas.foo 0 5.0 1.0 0 0 2 NA NA 1 5.0 2.1 0 1 4 0 0 2 6.0 NaN 0 NaN 1 0 1 5 6.8 6.8 1 0 5 0 0