看看这几行代码:
df2 = df.copy()
df2[1:] = df[1:]/df[:-1].values -1
df2.ix[0, :] = 0
我们的讲师说我们需要使用 .values 属性来访问底层的numpy数组,否则我们的代码将无效。
我知道pandas DataFrame确实有一个底层表示形式为numpy数组,但我不明白为什么我们不能直接使用切片操作pandas DataFrame。
你能解释一下这个吗?
答案 0 :(得分:8)
pandas专注于表格数据结构,在进行操作(加法,减法等)时,它会查看标签 - 而不是位置。
考虑以下DataFrame:
df = pd.DataFrame(np.random.randn(5, 3), index=list('abcde'), columns=list('xyz'))
此处df[1:]
为:
df[1:]
Out:
x y z
b 1.003035 0.172960 1.160033
c 0.117608 -1.114294 -0.557413
d -1.312315 1.171520 -1.034012
e -0.380719 -0.422896 1.073535
df[:-1]
是:
df[:-1]
Out:
x y z
a 1.367916 1.087607 -0.625777
b 1.003035 0.172960 1.160033
c 0.117608 -1.114294 -0.557413
d -1.312315 1.171520 -1.034012
如果您执行df[1:] / df[:-1]
,则会按行b
排,b
行,c
行排除行c
&#39} d
行d
行a
行e
&#39}。对于行nan
和df[1:] / df[:-1]
Out:
x y z
a NaN NaN NaN
b 1.0 1.0 1.0
c 1.0 1.0 1.0
d 1.0 1.0 1.0
e NaN NaN NaN
,它将无法在其他DataFrame中找到相应的行(在第一个或第二个中),因此它将返回.values
:< / p>
df[1:]/df[:-1].values
Out:
x y z
b 0.733258 0.159028 -1.853749
c 0.117252 -6.442482 -0.480515
d -11.158359 -1.051357 1.855018
e 0.290112 -0.360981 -1.038223
如果你只想忽略标签的元素划分,那么通过Vue.component('card-details', {
template: '<div class="modal-body">@{{message}}</div>',
// data is technically a function, so Vue won't
// complain, but we return the same object
// reference for each component instance
props: ['cardid'],
data: {
message: ''
},
mounted() {
this.$parent.$on("card-details:message", message => {
this.message = message;
});
},
}),
访问其中一个帧的底层numpy数组是告诉pandas忽略标签的一种方式。由于numpy数组没有标签,pandas只会进行逐元素操作:
getCCDetails: function (id) {
console.log(id)
console.log('calling function')
axios.get('/card/'.concat(id))
.then(function (response) {
this.message = JSON.stringify(response.data)
this.$emit('card-details:message', this.message) // <--
}.bind(this))
.catch(function (error) {
return this.message = 'Sorry there was an error'
}.bind(this));
}