我如何能:
- 选择数据框中的最后 3 列并创建一个新的数据框?
我试过了:
y = dataframe.iloc[:,-3:]
- 排除最后 3 列并创建一个新的数据框?
我试过了:
X = dataframe.iloc[:,:-3]
这个对吗?
我的代码中进一步出现数组维度错误,并希望确保此步骤正确。
谢谢
我如何能:
我试过了:
y = dataframe.iloc[:,-3:]
我试过了:
X = dataframe.iloc[:,:-3]
这个对吗?
我的代码中进一步出现数组维度错误,并希望确保此步骤正确。
谢谢
最有效的方法:
1.选择最后n列
df1 = df.iloc[:,-n:]
2.排除最后n列
df1 = df.iloc[:,:-n]
做就是了:
y = dataframe[dataframe.columns[-3:]]
这会对列进行切片,以便您可以从 df 中进行子选择
例子:
In [221]:
df = pd.DataFrame(columns=np.arange(10))
df[df.columns[-3:]]
Out[221]:
Empty DataFrame
Columns: [7, 8, 9]
Index: []
我认为这里的问题是,因为您已经获取了 df 的一部分,所以它返回了一个视图,但取决于您的其余代码正在做什么,它会发出警告。您可以通过调用.copy()
删除警告来制作显式副本。
因此,如果我们复制一份,那么赋值只会影响副本而不影响原始 df:
In [15]:
df = pd.DataFrame(np.random.randn(5,10), columns= np.arange(10))
df
Out[15]:
0 1 2 3 4 5 6 \
0 0.568284 -1.488447 0.970365 -1.406463 -0.413750 -0.934892 -1.421308
1 1.186414 -0.417366 -1.007509 -1.620530 -1.322004 0.294540 1.205115
2 -1.073894 -0.214972 1.516563 -0.705571 0.068666 1.690654 -0.252485
3 0.923524 -0.856752 0.226294 -0.660085 1.259145 0.400596 0.559028
4 0.259807 0.135300 1.130347 -0.317305 -1.031875 0.232262 0.709244
7 8 9
0 1.741925 -0.475619 -0.525770
1 2.137546 0.215665 1.908362
2 1.180281 -0.144652 0.870887
3 -0.609804 -0.833186 -1.033656
4 0.480943 1.971933 1.928037
In [16]:
y = df[df.columns[-3:]].copy()
y
Out[16]:
7 8 9
0 1.741925 -0.475619 -0.525770
1 2.137546 0.215665 1.908362
2 1.180281 -0.144652 0.870887
3 -0.609804 -0.833186 -1.033656
4 0.480943 1.971933 1.928037
In [17]:
y[y>0] = 0
print(y)
df
7 8 9
0 0.000000 -0.475619 -0.525770
1 0.000000 0.000000 0.000000
2 0.000000 -0.144652 0.000000
3 -0.609804 -0.833186 -1.033656
4 0.000000 0.000000 0.000000
Out[17]:
0 1 2 3 4 5 6 \
0 0.568284 -1.488447 0.970365 -1.406463 -0.413750 -0.934892 -1.421308
1 1.186414 -0.417366 -1.007509 -1.620530 -1.322004 0.294540 1.205115
2 -1.073894 -0.214972 1.516563 -0.705571 0.068666 1.690654 -0.252485
3 0.923524 -0.856752 0.226294 -0.660085 1.259145 0.400596 0.559028
4 0.259807 0.135300 1.130347 -0.317305 -1.031875 0.232262 0.709244
7 8 9
0 1.741925 -0.475619 -0.525770
1 2.137546 0.215665 1.908362
2 1.180281 -0.144652 0.870887
3 -0.609804 -0.833186 -1.033656
4 0.480943 1.971933 1.928037
这里没有发出警告,原始的 df 也没有受到影响。
这是因为使用了整数索引(ix 通过标签而不是位置来选择那些,这是设计使然:请参阅 pandas “gotchas”* 中的整数索引)。
*在较新版本的熊猫中,更喜欢 loc 或 iloc 来消除 ix 作为位置或标签的歧义:
df.iloc[-3:] 查看文档。
正如 Wes 指出的那样,在这种特定情况下,您应该只使用 tail!
还应该注意的是,在 Pandas 0.14 之前的版本中, iloc 会在越界访问时引发 IndexError,而 .head() 和 .tail() 不会:
PD。版本 '0.12.0' df = pd.DataFrame([{"a": 1}, {"a": 2}]) df.iloc[-5:] ... IndexError: out-of-bounds on slice (end) df.tail(5) a 0 1 1 2 旧答案(折旧方法):
您可以使用 irows DataFrame 方法来克服这种歧义:
注 [11]:df1.irow(slice(-3, None)) Out[11]:STK_ID RPT_Date TClose 销售折扣 8 568 20080331 38.75 12.668 NaN 9 568 20080630 30.09 21.102 NaN 10 568 20080930 NaN 26.00 3类似的 iget 方法。