numpy 如何计算pandas中n列而不是行之间的差异

qyswt5oh  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(89)

我想在一个大型的嵌套框架中查看列(或行)之间的差异。对于行,我使用了diff()方法,但对于列,我找不到等效的方法。
这是一种变通方法

df.transpose().diff().transpose()

字符串
有没有更有效的替代方案?

rwqw0loc

rwqw0loc1#

Pandas DataFrames非常适合操作列具有不同数据类型的表类数据。
如果列和行之间的减法都有意义,那么这意味着所有的值都是相同的数量。这可能表明你应该使用NumPy数组而不是Pandas DataFrame。
在任何情况下,您都可以使用arr = df.values从DataFrame中提取底层数据的NumPy数组。如果所有列共享相同的dtype,则NumPy数组将具有相同的dtype。(当列具有不同的dtype时,df.values具有object dtype)。
然后,您可以使用np.diff(arr, axis=...)计算沿着行或列的差异:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.arange(12).reshape(3,4), columns=list('ABCD'))
#    A  B   C   D
# 0  0  1   2   3
# 1  4  5   6   7
# 2  8  9  10  11

np.diff(df.values, axis=0)    # difference of the rows
# array([[4, 4, 4, 4],
#        [4, 4, 4, 4]])

np.diff(df.values, axis=1)    # difference of the columns
# array([[1, 1, 1],
#        [1, 1, 1],
#        [1, 1, 1]])

字符串

u4dcyp6a

u4dcyp6a2#

只是不同的列,例如。

df['new_col'] = df['a'] - df['b']

字符串
对于多列,我相信unutbu的答案是最好的(尽管它返回一个np.ndarray对象而不是一个嵌套框架,但即使在将其转换为嵌套框架之后,它仍然更快)。

# Create a large dataframe.
df = pd.DataFrame(np.random.randn(1e6, 100))

%%timeit
np.diff(df.values, axis=1)

1 loops, best of 3: 450 ms per loop

%%timeit
df - df.shift(axis=1)

1 loops, best of 3: 727 ms per loop

%%timeit
df.T.diff().T

1 loops, best of 3: 1.52 s per loop

kgsdhlau

kgsdhlau3#

diff中使用axis参数:

df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list('ABCD'))
#    A  B   C   D
# 0  0  1   2   3
# 1  4  5   6   7
# 2  8  9  10  11

df.diff(axis=1)            # subtracting column wise
#    A    B   C   D
# 0  NaN  1   1   1
# 1  NaN  1   1   1
# 2  NaN  1   1   1

df.diff()                  # subtracting row wise
#    A    B     C     D
# 0  NaN  NaN   NaN   NaN
# 1  4    4     4     4
# 2  4    4     4     4

字符串

相关问题