Сохранить/разрезать определенные столбцы в pandas - программирование
Подтвердить что ты не робот

Сохранить/разрезать определенные столбцы в pandas

Я знаю об этих методах среза столбца:

df2 = df[["col1", "col2", "col3"]] и df2 = df.ix[:,0:2]

но мне интересно, есть ли способ срезать столбцы из передней/средней/конечной части кадра данных в одном и том же фрагменте без отдельного перечисления каждого из них.

Например, dataframe df со столбцами: col1, col2, col3, col4, col5 и col6.

Есть ли способ сделать что-то вроде этого?

df2 = df.ix[:, [0:2, "col5"]]

Я нахожусь в ситуации, когда у меня есть сотни столбцов и обычно нужно разрезать конкретные для разных запросов. Я проверил документацию и не видел ничего подобного. Я что-то упустил?

Спасибо!

* Отредактировано для более четкого описания того, что я ищу.

4b9b3361

Ответ 1

IIUC, самый простой способ, о котором я могу думать, будет примерно таким:

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.random.randn(5, 10))
>>> df[list(df.columns[:2]) + [7]]
          0         1         7
0  0.210139  0.533249  1.780426
1  0.382136  0.083999 -0.392809
2 -0.237868  0.493646 -1.208330
3  1.242077 -0.781558  2.369851
4  1.910740 -0.643370  0.982876

где вызов list не является необязательным, поскольку в противном случае объект Index будет пытаться привязать вектор к 7.

Было бы возможно, чтобы в специальном случае что-то вроде numpy r_, чтобы

df[col_[:2, "col5", 3:6]]

будет работать, хотя я не знаю, будет ли это стоить проблемы.

Ответ 2

Если в именах столбцов есть информация, которую вы можете фильтровать, вы можете использовать df.filter(regex = 'name *'). Я использую это для фильтрации между моими 189 каналами данных от a1_01 до b3_21, и он отлично работает.

Ответ 3

Не уверен, что именно вы спрашиваете. Если вы хотите получить первую и последнюю 5 строк определенного столбца, вы можете сделать что-то вроде этого

df = pd.DataFrame({'col1': np.random.randint(0,3,1000),
               'col2': np.random.rand(1000),
               'col5': np.random.rand(1000)}) 
In [36]: df['col5']
Out[36]: 
0     0.566218
1     0.305987
2     0.852257
3     0.932764
4     0.185677
...
996    0.268700
997    0.036250
998    0.470009
999    0.361089
Name: col5, Length: 1000 
In [38]: df['col5'][(df.index < 5) | (df.index > (len(df) - 5))]
Out[38]: 
0      0.566218
1      0.305987
2      0.852257
3      0.932764
4      0.185677
996    0.268700
997    0.036250
998    0.470009
999    0.361089
Name: col5

Или, в общем, вы могли бы написать функцию

In [41]: def head_and_tail(df, n=5):
    ...:     return df[(df.index < n) | (df.index > (len(df) - n))] 
In [44]: head_and_tail(df, 7)
Out[44]: 
     col1      col2      col5
0       0  0.489944  0.566218
1       1  0.639213  0.305987
2       1  0.000690  0.852257
3       2  0.620568  0.932764
4       0  0.310816  0.185677
5       0  0.930496  0.678504
6       2  0.165250  0.440811
994     2  0.842181  0.636472
995     0  0.899453  0.830839
996     0  0.418264  0.268700
997     0  0.228304  0.036250
998     2  0.031277  0.470009
999     1  0.542502  0.361089