将行分组并减去 python

Group rows and subtract in python

我有一个包含两个列表的数组,如下所示:

([1,1,1,2,2,3,3,4,4,5,5],[29,34,70,21,56,43,89,11,90,42,87])

最终我希望能够找到索引为 1 的值之间的差异,即 29、34 和 70。对于显示的所有其他索引也是如此。

我已经把它变成了一个数据框,但这相当没有意义 - 我一直在寻找与 pandas 一起工作并且之前发现这更容易;但我现在只能选择不同格式的相同数据。

我生成的数据框使用了这段代码:

df = pd.DataFrame({'Index': index, 'Value': value})

我也尝试过使用 split 来分隔行作为减法之前的起点,但是这是不成功的,因为 1 索引构成了三行而不是两行,所以没有固定的间隔。

所以期望的结果看起来像这样:

([1,1,2,3,4,5],[5,36,35,46,79,35])

任何形式的数据框、数组、列表等...

任何有关 this/steps 的帮助将不胜感激!

我相信这就是你想要的:

df = pd.DataFrame({'Index' :[1,1,1,2,2,3,3,4,4,5,5],
                   'Values':[29,34,70,21,56,43,89,11,90,42,87]})
df.sort_values('Index', ignore_index=True, inplace=True)
  Index Values
0     1     29
1     1     34
2     1     70
3     2     21
4     2     56
5     3     43
6     3     89
7     4     11
8     4     90
9     5     42
10    5     87

正在创建一个新列,其中包含索引组应用的差异:

df['Diff'] = df.groupby('Index').diff()

输出:

  Index Values  Diff
0     1     29   NaN
1     1     34   5.0
2     1     70  36.0
3     2     21   NaN
4     2     56  35.0
5     3     43   NaN
6     3     89  46.0
7     4     11   NaN
8     4     90  79.0
9     5     42   NaN
10    5     87  45.0

删除 NaN 行:

df.dropna(inplace=True)

输出:

df

  Index Values   Diff
1     1     34    5.0
2     1     70   36.0
4     2     56   35.0
6     3     89   46.0
8     4     90   79.0
10    5     87   45.0

开始于:

data = ([1,1,1,2,2,3,3,4,4,5,5],[29,34,70,21,56,43,89,11,90,42,87])

我们可以使用适当的值和索引创建一个 pandas.Series,然后按索引分组,应用 .diff,然后删除缺失值:

s = pd.Series(data[1], index=data[0]).groupby(level=0).diff().dropna()

这给了我们:

1     5.0
1    36.0
2    35.0
3    46.0
4    79.0
5    45.0
dtype: float64

然后创建转换为列表的索引和值的二元组:

out = (s.index.to_list(), s.to_list())

你最终得到:

([1, 1, 2, 3, 4, 5], [5.0, 36.0, 35.0, 46.0, 79.0, 45.0])