提取熊猫中数据框架的第一行和最后一行

如何提取给定数据框架的第一行和最后一行作为熊猫中的新数据框架?

我尝试使用 iloc选择所需的行,然后使用 concat,如下所示:

df=pd.DataFrame({'a':range(1,5), 'b':['a','b','c','d']})
pd.concat([df.iloc[0,:], df.iloc[-1,:]])

但这并不产生一个熊猫数据框架:

a    1
b    a
a    4
b    d
dtype: object
260237 次浏览

我认为你可以尝试将参数 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

我认为最简单的方法是 .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

你也可以使用 headtail:

In [29]: pd.concat([df.head(1), df.tail(1)])
Out[29]:
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

因为单行同时是第一行和最后一行。

下面是与大型数据集相同的样式:

x = df[:5]
y = pd.DataFrame([['...']*df.shape[1]], columns=df.columns, index=['...'])
z = df[-5:]
frame = [x, y, z]
result = pd.concat(frame)


print(result)

产出:

                     date  temp
0     1981-01-01 00:00:00  20.7
1     1981-01-02 00:00:00  17.9
2     1981-01-03 00:00:00  18.8
3     1981-01-04 00:00:00  14.6
4     1981-01-05 00:00:00  15.8
...                   ...   ...
3645  1990-12-27 00:00:00    14
3646  1990-12-28 00:00:00  13.6
3647  1990-12-29 00:00:00  13.5
3648  1990-12-30 00:00:00  15.7
3649  1990-12-31 00:00:00    13

你也可以选择使用 take:

In [3]: df.take([0, -1])
Out[3]:
a  b
0  1  a
3  4  d