python pandas选择头部和尾部

时间:2017-02-28 09:33:36

标签: python pandas slice tail head

对于Pandas中的DataFrame,如何选择前5个值和后5个值? 例如

In [11]: df
Out[11]: 
        A  B  C
2012-11-29  0  0  0
2012-11-30  1  1  1
2012-12-01  2  2  2
2012-12-02  3  3  3
2012-12-03  4  4  4
2012-12-04  5  5  5
2012-12-05  6  6  6
2012-12-06  7  7  7
2012-12-07  8  8  8
2012-12-08  9  9  9

如何显示第一行和最后两行?

9 个答案:

答案 0 :(得分:12)

您可以iloc使用numpy.r_

print (np.r_[0:2, -2:0])
[ 0  1 -2 -1]

df = df.iloc[np.r_[0:2, -2:0]]
print (df)
            A  B  C
2012-11-29  0  0  0
2012-11-30  1  1  1
2012-12-07  8  8  8
2012-12-08  9  9  9
df = df.iloc[np.r_[0:4, -4:0]]
print (df)
            A  B  C
2012-11-29  0  0  0
2012-11-30  1  1  1
2012-12-01  2  2  2
2012-12-02  3  3  3
2012-12-05  6  6  6
2012-12-06  7  7  7
2012-12-07  8  8  8
2012-12-08  9  9  9

答案 1 :(得分:8)

您可以使用df.head(5)df.tail(5)获得前五名和后五名。 您可以选择创建新数据框和append() head and tail:

new_df = df.tail(5)
new_df = new_df.append(df.head(5))

答案 2 :(得分:5)

小简单功能:

def ends(df, x=5):
    return df.head(x).append(df.tail(x))

并像这样使用:

df = pd.DataFrame(np.random.rand(15,6))
ends(df,2)

我实际上使用了这么多,我认为添加到pandas将是一个很棒的功能。(没有功能添加到pandas.DataFrame核心API)我在导入之后添加它这样:

import pandas as pd
def ends(df, x=5):
    return df.head(x).append(df.tail(x))
setattr(pd.DataFrame,'ends',ends)

像这样使用:

import numpy as np
df = pd.DataFrame(np.random.rand(15,6))
df.ends(2)

答案 3 :(得分:3)

为此,您应同时使用head()tail()。我认为最简单的方法是:

df.head(5).append(df.tail(5))

答案 4 :(得分:2)

完全相同的问题,但如果您只想显示上/下5行(例如jupyter中的display或常规{{1如果您使用pd.option_context上下文,则可能有一种比这更简单的方法。

print

输出:

#make 100 3d random numbers
df = pd.DataFrame(np.random.randn(100,3))

# sort them by their axis sum
df = df.loc[df.sum(axis=1).index]

with pd.option_context('display.max_rows',10):
    print(df)

答案 5 :(得分:0)

你可以使用df.head(2)和df.tail(2)

答案 6 :(得分:0)

与Linas Fx合作。

在下面定义

pd.DataFrame.less = lambda df, n=10: df.head(n//2).append(df.tail(n//2))

然后您只能输入df.less()

与类型df.head().append(df.tail())

相同

如果您输入df.less(2),则结果与df.head(1).append(df.tail(1))

相同

答案 7 :(得分:0)

Jupyter 中,扩展@bolster的答案,我们将创建一个可重复使用的便捷功能:

def display_n(df,n): 
    with pd.option_context('display.max_rows',n*2):
        display(df)

然后

display_n(df,2)

返回

         0           1           2
0        0.167961    -0.732745   0.952637
1        -0.050742   -0.421239   0.444715
...      ...         ...         ...
98       0.085264    0.982093    -0.509356
99       -0.758963   -0.578267   -0.115865

(除非是格式良好的HTML表格)

当df为df = pd.DataFrame(np.random.randn(100,3))

注意:

  1. 当然,您可以通过将上面的display修改为print来使打印的内容与文本相同。
  2. 在类似Unix的系统上,您可以按照上述here的说明,将上述功能自动加载到py的{​​{1}}或ipy文件中,以在所有笔记本电脑中自动加载上述功能。

答案 8 :(得分:0)

如果只想将其保留在熊猫中,可以使用apply()连接头和尾:

import pandas as pd
from string import ascii_lowercase, ascii_uppercase

df = pd.DataFrame(
    {"upper": list(ascii_uppercase), "lower": list(ascii_lowercase)}, index=range(1, 27)
)

df.apply(lambda x: pd.concat([x.head(2), x.tail(2)]))


   upper lower
1      A     a
2      B     b
25     Y     y
26     Z     z