看看这几行代码:
df2 = df.copy()
df2[1:] = df[1:]/df[:-1].values -1
df2.ix[0, :] = 0
我们的讲师说我们需要使用 .values 属性来访问底层的 numpy 数组,否则我们的代码将无法运行。
我知道 pandas DataFrame 确实有一个作为 numpy 数组的底层表示,但我不明白为什么我们不能仅使用切片直接在 pandas DataFrame 上操作。
你能解释一下吗?
最佳答案
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
行' s,c
行的 c
行和 d
行的 d
行。对于 a
和 e
行,它将无法在另一个 DataFrame 中找到相应的行(无论是在第一个还是在第二个),因此它将返回 南
:
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
关于python - Pandas 与 Numpy 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43832735/