有没有办法在pandas数据框列中找到最大的变化?

时间:2019-11-22 00:27:20

标签: python pandas

我试图找出i和j之间最大的差值,而我不能早于j。有没有一种有效的方法可以在熊猫中做到这一点?

x = [1, 2, 5, 4, 2, 4, 2, 1, 7]
largest_change = 0

for i in range(len(x)):
    for j in range(i+1, len(x)):
        change = x[i] - x[j]
        print(x[i], x[j], change)
        if change > largest_change:
            largest_change = change

输出将只是值,在这种情况下,从5到1是4。

5 个答案:

答案 0 :(得分:4)

尝试使用np.triumax进行numpy广播

arr = np.array(x)
np.triu(arr[:,None] - arr)

array([[ 0, -1, -4, -3, -1, -3, -1,  0, -6],
       [ 0,  0, -3, -2,  0, -2,  0,  1, -5],
       [ 0,  0,  0,  1,  3,  1,  3,  4, -2],
       [ 0,  0,  0,  0,  2,  0,  2,  3, -3],
       [ 0,  0,  0,  0,  0, -2,  0,  1, -5],
       [ 0,  0,  0,  0,  0,  0,  2,  3, -3],
       [ 0,  0,  0,  0,  0,  0,  0,  1, -5],
       [ 0,  0,  0,  0,  0,  0,  0,  0, -6],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0]])

np.triu(arr[:,None] - arr).max()

Out[758]: 4

答案 1 :(得分:2)

除了安迪的聪明方法之外,这是向后传播最小值的另一种方法,其优点是在处理大量数据的情况下具有线性时间复杂度,而不是二次时间。

a = np.flipud(np.array(x))
largest_change = (a - np.minimum.accumulate(a)).max()

答案 2 :(得分:0)

怎么样?

x = [1, 2, 5, 4, 2, 4, 2, 1, 7]
largest_change = 0
position = 0

for i in range(len(x)-1):
    change = x[i] - min(x[i+1:])
    if change > largest_change:
        largest_change = change
        position = i

print(x[position], min(x[position+1:]), largest_change)

答案 3 :(得分:0)

您为什么不只拿diff,然后拿最大的那笔钱?

x = [1, 2, 5, 4, 2, 4, 2, 1, 7]
s = pd.Series(x)

z = abs(s.diff())
idx_max_val = z[z==z.max()].index[0]

print(f'Max difference in value ({z.max()}) occurs at the indices of {idx_max_val-1}:{idx_max_val}')

答案 4 :(得分:-1)

我建议滚动窗口:

import pandas
df = pandas.DataFrame({'col1': [1, 2, 5, 4, 2, 4, 2, 1, 7]})
df["diff"] = df['col1'].rolling(window=2).apply(lambda x: x[1] - x[0])
print(df["diff"].max())

输出:6.0

还是我误会了您,而您只是想要任何两个值之间的最大差异? 这将是:

import pandas
df = pandas.DataFrame({'col1': [1, 2, 5, 4, 2, 4, 2, 1, 7]})
max_diff = df["col1"].max() - df["col1"].min()
print("Min:", df["col1"].min(), "Max:", df["col1"].max(), "Diff:", max_diff)

输出:

Min: 1 Max: 7 Diff: 6