【问题标题】:Pandas vs. Numpy DataframesPandas 与 Numpy 数据框
【发布时间】:2017-10-05 13:49:16
【问题描述】:

看看这几行代码:

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

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

我知道 pandas DataFrame 确实具有作为 numpy 数组的底层表示,但我不明白为什么我们不能仅使用切片直接对 pandas DataFrame 进行操作。

你能解释一下吗?

【问题讨论】:

    标签: python pandas numpy multidimensional-array dataframe


    【解决方案1】:

    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],它将逐行划分bbc 逐行cd 逐行@987654332 @的。对于ae 行,它将无法在另一个DataFrame 中找到对应的行(在第一个或第二个中),因此它将返回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
    

    如果您只想在忽略标签的情况下进行元素除法,则通过 .values 访问底层 numpy 数组以获取其中一个帧是告诉 pandas 忽略标签的一种方式。由于 numpy 数组没有标签,pandas 只会进行元素操作:

    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
    

    【讨论】:

    • 现在,我知道最终结果会是一样的,但我想知道将 numpy 数组也用于分子是否更正式。
    • 在这种情况下,整个操作将在 numpy 中,因此它将返回一个没有标签的数组。请注意,在最终输出 (df[1:]/df[:-1].values) 中,结果是一个 DataFrame。因此,它将基于您的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2019-11-07
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多