pandas:选择名称以X开头的所有列的最佳方法

发布于 2021-01-29 19:33:33

我有一个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.。除了以下以外,还有更好的方法吗:

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]
关注者
0
被浏览
70
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    只需执行列表推导即可创建您的列:

    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

    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条件的值:

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看