将行分组并减去 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])
我有一个包含两个列表的数组,如下所示:
([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])