Сохранить/разрезать определенные столбцы в 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"]]
Я нахожусь в ситуации, когда у меня есть сотни столбцов и обычно нужно разрезать конкретные для разных запросов. Я проверил документацию и не видел ничего подобного. Я что-то упустил?
Спасибо!
* Отредактировано для более четкого описания того, что я ищу.
Ответы
Ответ 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