我知道这些列切片方法:
df2 = df[["col1", "col2", "col3"]]
和df2 = df.ix[:,0:2]
但是我想知道是否有办法在同一切片中从数据帧的前/中/末端切片,而不是专门列出每一列。
例如,数据框df
包含列:col1,col2,col3,col4,col5和col6。
有没有办法做这样的事情?
df2 = df.ix[:, [0:2, "col5"]]
我遇到的情况是我有数百列,并且经常需要根据不同的请求对特定列进行切片。我查看了文档并没有看到类似的东西。我忽略了什么吗?
答案 0 :(得分:14)
IIUC,我能想到的最简单的方法就是这样:
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.random.randn(5, 10))
>>> df[list(df.columns[:2]) + [7]]
0 1 7
0 0.210139 0.533249 1.780426
1 0.382136 0.083999 -0.392809
2 -0.237868 0.493646 -1.208330
3 1.242077 -0.781558 2.369851
4 1.910740 -0.643370 0.982876
list
调用不是可选的,否则Index
对象会尝试将自身向量添加到7。
有可能像numpy的r_
这样的特殊情况,以便
df[col_[:2, "col5", 3:6]]
会起作用,虽然我不知道是否值得这么麻烦。
答案 1 :(得分:5)
如果列名具有可以过滤的信息,则可以使用df.filter(regex ='name *')。 我用它来从我的189个数据通道之间进行过滤,从a1_01到b3_21,它运行正常。
答案 2 :(得分:-1)
不确定你究竟在问什么。如果您想要特定列的第一行和最后一行,您可以执行类似这样的操作
df = pd.DataFrame({'col1': np.random.randint(0,3,1000),
'col2': np.random.rand(1000),
'col5': np.random.rand(1000)})
In [36]: df['col5']
Out[36]:
0 0.566218
1 0.305987
2 0.852257
3 0.932764
4 0.185677
...
996 0.268700
997 0.036250
998 0.470009
999 0.361089
Name: col5, Length: 1000
In [38]: df['col5'][(df.index < 5) | (df.index > (len(df) - 5))]
Out[38]:
0 0.566218
1 0.305987
2 0.852257
3 0.932764
4 0.185677
996 0.268700
997 0.036250
998 0.470009
999 0.361089
Name: col5
或者,更一般地说,你可以写一个函数
In [41]: def head_and_tail(df, n=5):
...: return df[(df.index < n) | (df.index > (len(df) - n))]
In [44]: head_and_tail(df, 7)
Out[44]:
col1 col2 col5
0 0 0.489944 0.566218
1 1 0.639213 0.305987
2 1 0.000690 0.852257
3 2 0.620568 0.932764
4 0 0.310816 0.185677
5 0 0.930496 0.678504
6 2 0.165250 0.440811
994 2 0.842181 0.636472
995 0 0.899453 0.830839
996 0 0.418264 0.268700
997 0 0.228304 0.036250
998 2 0.031277 0.470009
999 1 0.542502 0.361089