熊猫与Numpy Dataframes

时间:2017-05-07 14:33:46

标签: python pandas numpy multidimensional-array dataframe

看看这几行代码:

df2 = df.copy()
df2[1:] = df[1:]/df[:-1].values -1
df2.ix[0, :] = 0

我们的讲师说我们需要使用 .values 属性来访问底层的numpy数组,否则我们的代码将无效。

我知道pandas DataFrame确实有一个底层表示形式为numpy数组,但我不明白为什么我们不能直接使用切片操作pandas DataFrame。

你能解释一下这个吗?

1 个答案:

答案 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} ddae&#39}。对于行nandf[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));

    }