带条件的熊猫行过滤

时间:2018-11-09 13:59:32

标签: python pandas filter

我的熊猫数据框如下:

>df
          time           w_m       w_s       p_m       p_s
0            1  43102.490062  0.935265  0.000000  0.416194
1            2  41692.002871  0.942409  0.000000  0.416208
2            3  40592.822117  0.956229  0.000000  0.416222
3            4  40218.101405  0.956392  0.000000  0.416236
4            5  39606.057576  0.958667  0.000000  0.416250
5            6  37483.601032  0.961907  0.000000  0.416264
6            7  37678.647967  0.965330  0.000000  0.416278
7            8  38082.193349  0.965330  0.000000  0.416292

我想过滤我的数据框,以便仅在其标题名称的末尾带有'_m'的行。

我希望通过a = df.some_method()完成以下输出:

>a

             w_m       p_m
0   43102.490062  0.000000 
1   41692.002871  0.000000
2   40592.822117  0.000000
3   40218.101405  0.000000
4   39606.057576  0.000000
5   37483.601032  0.000000
6   37678.647967  0.000000
7   38082.193349  0.000000

我该怎么做?

3 个答案:

答案 0 :(得分:3)

filter与参数regex^用作字符串的匹配开始,或将$用作字符串的匹配结束:

print (df)
   time           w_m     _mw_s  p_m     _mp_s
0     1  43102.490062  0.935265  0.0  0.416194
1     2  41692.002871  0.942409  0.0  0.416208
2     3  40592.822117  0.956229  0.0  0.416222
3     4  40218.101405  0.956392  0.0  0.416236
4     5  39606.057576  0.958667  0.0  0.416250
5     6  37483.601032  0.961907  0.0  0.416264
6     7  37678.647967  0.965330  0.0  0.416278
7     8  38082.193349  0.965330  0.0  0.416292

df1 = df.filter(regex='^_m')
print (df1)
      _mw_s     _mp_s
0  0.935265  0.416194
1  0.942409  0.416208
2  0.956229  0.416222
3  0.956392  0.416236
4  0.958667  0.416250
5  0.961907  0.416264
6  0.965330  0.416278
7  0.965330  0.416292

df2 = df.filter(regex='_m$')
print (df2)
            w_m  p_m
0  43102.490062  0.0
1  41692.002871  0.0
2  40592.822117  0.0
3  40218.101405  0.0
4  39606.057576  0.0
5  37483.601032  0.0
6  37678.647967  0.0
7  38082.193349  0.0

如果要所有值_m使用参数like

df3 = df.filter(like='_m')
print (df3)
            w_m     _mw_s  p_m     _mp_s
0  43102.490062  0.935265  0.0  0.416194
1  41692.002871  0.942409  0.0  0.416208
2  40592.822117  0.956229  0.0  0.416222
3  40218.101405  0.956392  0.0  0.416236
4  39606.057576  0.958667  0.0  0.416250
5  37483.601032  0.961907  0.0  0.416264
6  37678.647967  0.965330  0.0  0.416278
7  38082.193349  0.965330  0.0  0.416292

答案 1 :(得分:1)

ilocstr.contains一起使用:

a = df.iloc[:,df.columns.str.contains('_m$')]

print(a)
            w_m  p_m
0  43102.490062  0.0
1  41692.002871  0.0
2  40592.822117  0.0
3  40218.101405  0.0
4  39606.057576  0.0
5  37483.601032  0.0
6  37678.647967  0.0
7  38082.193349  0.0

说明:

  1. 如果要在名称末尾检查_m,请使用_m$作为正则表达式
  2. 如果您想在名称的开头检查_m,请使用^_m作为正则表达式
  3. 如果您只想检查是否包含_m,请使用_m作为正则表达式。

答案 2 :(得分:1)

列表理解解决方案:

df_new = df[[c for c in df.columns if c.endswith('_m')]]