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

2024-04-26 03:25:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩弄数据,需要在一个相当大的数据框中查看列(以及行)之间的差异。 行的最简单方法显然是diff()方法,但我找不到与列等效的方法?

我当前的解决方案是获取一个数据帧,其中的列与via的列不同

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

有没有更有效的替代方案?或者熊猫的这种奇怪用法从未被要求/认为有用?:)

谢谢


Tags: 数据方法用法df方案diff差异解决方案
3条回答

使用^{}中的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

Pandas数据帧非常适合处理其列具有不同数据类型的表型数据。

如果跨列和跨行减去都有意义,则意味着所有值的数量都相同。可能表示您应该使用NumPy数组而不是Pandas数据帧。

在任何情况下,都可以使用arr = df.values从数据帧中提取底层数据的NumPy数组。如果所有列共享相同的数据类型,则NumPy数组将具有相同的数据类型。(当列具有不同的数据类型时,df.values具有object数据类型)。

然后可以使用^{}计算行或列之间的差异:

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]])

只需区分列,例如

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

对于多个列,我认为unutbu的答案是最好的(尽管它返回的是np.ndarray对象而不是dataframe,但即使在将其转换为dataframe之后,它仍然更快)。

# 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

相关问题 更多 >