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

时间:2015-03-23 19:07:18

标签: python numpy pandas

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

我目前的解决方案是获取一个数据框,其中列的区别为via

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

是否有更有效的替代方案?或者这是如此奇怪的使用大熊猫,这是从来没有被要求/认为有用? :)

谢谢,

3 个答案:

答案 0 :(得分:6)

Pandas DataFrames非常适合处理其列具有不同dtypes的类似表的数据。

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

在任何情况下,您都可以使用arr = df.values从DataFrame中提取基础数据的NumPy数组。如果所有列共享相同的dtype,则NumPy数组将具有相同的dtype。 (当列具有不同的dtypes时,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]])

答案 1 :(得分:1)

只是区别于列,例如

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

答案 2 :(得分:1)

使用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