фильтрация строк панд с условием - PullRequest
0 голосов
/ 09 ноября 2018

Мой кадр данных для панд выглядит следующим образом:

>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 голосов
/ 09 ноября 2018

Использование iloc с str.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 в качестве регулярного выражения.
0 голосов
/ 09 ноября 2018

Решение для понимания списка:

df_new = df[[c for c in df.columns if c.endswith('_m')]]
0 голосов
/ 09 ноября 2018

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...