python pandas select 头部和尾部
python pandas select both head and tail
对于 Pandas 中的 DataFrame,我如何 select 前 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
如何显示前两行和后两行?
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
您可以使用 df.head(5)
和 df.tail(5)
来获取前五个和后五个。
您可以选择创建新的数据框和 append()
head and tail:
new_df = df.tail(5)
new_df = new_df.append(df.head(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)
与 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))
相同
不是相当同样的问题,但如果你只想显示顶部/底部5行(例如display
在 jupyter 或常规 print
中,如果您使用 pd.option_context
上下文,可能有比这更简单的方法。
#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)
输出:
0 1 2
0 -0.649105 -0.413335 0.374872
1 3.390490 0.552708 -1.723864
2 -0.781308 -0.277342 -0.903127
3 0.433665 -1.125215 -0.290228
4 -2.028750 -0.083870 -0.094274
.. ... ... ...
95 0.443618 -1.473138 1.132161
96 -1.370215 -0.196425 -0.528401
97 1.062717 -0.997204 -1.666953
98 1.303512 0.699318 -0.863577
99 -0.109340 -1.330882 -1.455040
[100 rows x 3 columns]
在 Jupyter 中,扩展@bolster 的回答,我们将创建一个可重用的便利函数:
def display_n(df,n):
with pd.option_context('display.max_rows',n*2):
display(df)
然后
display_n(df,2)
Returns
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 table)
当 df 为 df = pd.DataFrame(np.random.randn(100,3))
备注:
- 当然你可以通过将上面的
display
修改为print
来使同样的东西打印成文本。
- 在类 unix 系统上,您可以在所有笔记本中自动加载上述功能,方法是将其放置在
~/.ipython/profile_default/startup
中的 py
或 ipy
文件中,如 here 所述].
为此,您应该同时使用 head()
和 tail()
。我认为最简单的方法是:
df.head(5).append(df.tail(5))
如果你想保持Pandas,你可以使用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
对于 Pandas 中的 DataFrame,我如何 select 前 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
如何显示前两行和后两行?
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
您可以使用 df.head(5)
和 df.tail(5)
来获取前五个和后五个。
您可以选择创建新的数据框和 append()
head and tail:
new_df = df.tail(5)
new_df = new_df.append(df.head(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)
与 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))
不是相当同样的问题,但如果你只想显示顶部/底部5行(例如display
在 jupyter 或常规 print
中,如果您使用 pd.option_context
上下文,可能有比这更简单的方法。
#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)
输出:
0 1 2
0 -0.649105 -0.413335 0.374872
1 3.390490 0.552708 -1.723864
2 -0.781308 -0.277342 -0.903127
3 0.433665 -1.125215 -0.290228
4 -2.028750 -0.083870 -0.094274
.. ... ... ...
95 0.443618 -1.473138 1.132161
96 -1.370215 -0.196425 -0.528401
97 1.062717 -0.997204 -1.666953
98 1.303512 0.699318 -0.863577
99 -0.109340 -1.330882 -1.455040
[100 rows x 3 columns]
在 Jupyter 中,扩展@bolster 的回答,我们将创建一个可重用的便利函数:
def display_n(df,n):
with pd.option_context('display.max_rows',n*2):
display(df)
然后
display_n(df,2)
Returns
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 table)
当 df 为 df = pd.DataFrame(np.random.randn(100,3))
备注:
- 当然你可以通过将上面的
display
修改为print
来使同样的东西打印成文本。 - 在类 unix 系统上,您可以在所有笔记本中自动加载上述功能,方法是将其放置在
~/.ipython/profile_default/startup
中的py
或ipy
文件中,如 here 所述].
为此,您应该同时使用 head()
和 tail()
。我认为最简单的方法是:
df.head(5).append(df.tail(5))
如果你想保持Pandas,你可以使用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