我正在玩数据,需要在相当大的数据帧中查看列(以及行)之间的差异。 行的最简单方法显然是diff()方法,但我找不到列的等价物?
我目前的解决方案是获取一个数据框,其中列的区别为via
df.transpose().diff().transpose()
是否有更有效的替代方案?或者这是如此奇怪的使用大熊猫,这是从来没有被要求/认为有用? :)
谢谢,
答案 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