Ответ 1
Я думаю, что самый простой способ - .iloc[[0, -1]]
.
df = pd.DataFrame({'a':range(1,5), 'b':['a','b','c','d']})
df2 = df.iloc[[0, -1]]
print df2
a b
0 1 a
3 4 d
Как я могу извлечь первую и последнюю строки данного фрейма данных в качестве нового фрейма данных в pandas?
Я попытался использовать iloc
, чтобы выбрать нужные строки, а затем concat
, как в:
df=pd.DataFrame({'a':range(1,5), 'b':['a','b','c','d']})
pd.concat([df.iloc[0,:], df.iloc[-1,:]])
но это не создает фреймворк pandas:
a 1
b a
a 4
b d
dtype: object
Я думаю, что самый простой способ - .iloc[[0, -1]]
.
df = pd.DataFrame({'a':range(1,5), 'b':['a','b','c','d']})
df2 = df.iloc[[0, -1]]
print df2
a b
0 1 a
3 4 d
Вы также можете использовать head
и tail
:
In [29]: pd.concat([df.head(1), df.tail(1)])
Out[29]:
a b
0 1 a
3 4 d
Я думаю, вы можете попробовать добавить параметр axis=1
в concat
, поскольку вывод df.iloc[0,:]
и df.iloc[-1,:]
равен Series
и транспонируйте T
:
print df.iloc[0,:]
a 1
b a
Name: 0, dtype: object
print df.iloc[-1,:]
a 4
b d
Name: 3, dtype: object
print pd.concat([df.iloc[0,:], df.iloc[-1,:]], axis=1)
0 3
a 1 4
b a d
print pd.concat([df.iloc[0,:], df.iloc[-1,:]], axis=1).T
a b
0 1 a
3 4 d
Принятый ответ дублирует первую строку, если кадр содержит только одну строку. Если это беспокойство
df[0::len(df)-1 if len(df) > 1 else 1]
работает даже для отдельных строк данных.
Для следующего кадра данных это не создаст дубликат:
df = pd.DataFrame({'a': [1], 'b':['a']})
df2 = df[0::len(df)-1 if len(df) > 1 else 1]
print df2
a b
0 1 a
тогда как это делает:
df3 = df.iloc[[0, -1]]
print df3
a b
0 1 a
0 1 a
потому что одна строка - это первая И последняя строка одновременно.