提取Pandas Dataframe 的第一行和最后一行

9rygscc1  于 2023-03-11  发布在  其他
关注(0)|答案(7)|浏览(541)

如何将给定 Dataframe 的第一行和最后一行提取为panda中的新 Dataframe ?

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

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

但这并没有产生Pandas的 Dataframe :

a    1
b    a
a    4
b    d
dtype: object
xbp102n0

xbp102n01#

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

ffdz8vbo2#

也可以使用headtail

In [29]: pd.concat([df.head(1), df.tail(1)])
Out[29]:
   a  b
0  1  a
3  4  d
nue99wik

nue99wik3#

如果框架只包含一行,则接受的答案复制第一行。
df[0::len(df)-1 if len(df) > 1 else 1]
甚至对单行 Dataframe 也有效。
示例:对于以下 Dataframe ,这不会创建副本:

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

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

sigwle7e

sigwle7e4#

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

holgip5t5#

或者,您可以使用take

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

1aaf6o9v6#

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

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
zpf6vheq

zpf6vheq7#

我觉得这是一个很有用的问题,我个人比较喜欢看到 Dataframe 的前n行和最后n行,而不是用.head().tail(),我发现

# n should change to 1 to see only the first and last row
df.drop(df.index[n:-n])

pd.concat稍快。下面是一个测试。

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

%%time
pd.concat([df.head(n),df.tail(n)]) 

%%time
df.drop(df.index[n:-n])

在我的例子中,与pd.concat()相比,df.drop(df.index[1:-1])花费了一半的时间。
希望这个答案还能有用。

相关问题