我有以下数据框(示例):
import pandas as pd
n = 3
data = [['A', '2022-09-01', False, 2, -3], ['A', '2022-09-02', False, 1, -2], ['A', '2022-09-03', False, 1, -1], ['A', '2022-09-04', True, 3, 0],
['A', '2022-09-05', False, 3, 1], ['A', '2022-09-06', False, 2, 2], ['A', '2022-09-07', False, 1, 3], ['A', '2022-09-07', False, 2, 3],
['A', '2022-09-08', False, 4, 4], ['A', '2022-09-09', False, 2, 5],
['B', '2022-09-01', False, 2, -4], ['B', '2022-09-02', False, 2, -3], ['B', '2022-09-03', False, 4, -2], ['B', '2022-09-04', False, 2, -1],
['B', '2022-09-05', True, 2, 0], ['B', '2022-09-06', False, 2, 1], ['B', '2022-09-07', False, 1, 2], ['B', '2022-09-08', False, 3, 3],
['B', '2022-09-09', False, 3, 4], ['B', '2022-09-10', False, 2, 5]]
df = pd.DataFrame(data = data, columns = ['group', 'date', 'indicator', 'value', 'diff_days'])
group date indicator value diff_days
0 A 2022-09-01 False 2 -3
1 A 2022-09-02 False 1 -2
2 A 2022-09-03 False 1 -1
3 A 2022-09-04 True 3 0
4 A 2022-09-05 False 3 1
5 A 2022-09-06 False 2 2
6 A 2022-09-07 False 1 3
7 A 2022-09-07 False 2 3
8 A 2022-09-08 False 4 4
9 A 2022-09-09 False 2 5
10 B 2022-09-01 False 2 -4
11 B 2022-09-02 False 2 -3
12 B 2022-09-03 False 4 -2
13 B 2022-09-04 False 2 -1
14 B 2022-09-05 True 2 0
15 B 2022-09-06 False 2 1
16 B 2022-09-07 False 1 2
17 B 2022-09-08 False 3 3
18 B 2022-09-09 False 3 4
19 B 2022-09-10 False 2 5
我想计算每组n行相对于条件行的斜率(指标== True)。因此,这意味着它应该返回一列“slope”,其中包含条件行之前和之后的斜率,其中该行的斜率为 0。 除此之外,我想返回一个名为“id”的列,它实际上是一个组 id表示该条件行之前(负)或之后(正)斜率的值。这是所需的输出:
data = [['A', '2022-09-01', False, 2, -3, -1, -0.5], ['A', '2022-09-02', False, 1, -2, -1, -0.5], ['A', '2022-09-03', False, 1, -1, -1, -0.5], ['A', '2022-09-04', True, 3, 0, 0, 0],
['A', '2022-09-05', False, 3, 1, 1, -1], ['A', '2022-09-06', False, 2, 2, 1, -1], ['A', '2022-09-07', False, 1, 3, 1, -1], ['A', '2022-09-07', False, 2, 3, 2, 0],
['A', '2022-09-08', False, 4, 4, 2, 0], ['A', '2022-09-09', False, 2, 5, 2, 0],
['B', '2022-09-01', False, 2, -4, -2], ['B', '2022-09-02', False, 2, -3, -1, 0], ['B', '2022-09-03', False, 4, -2, -1, 0], ['B', '2022-09-04', False, 2, -1, -1, 0],
['B', '2022-09-05', True, 2, 0, 0, 0], ['B', '2022-09-06', False, 2, 1, 1, 0.5], ['B', '2022-09-07', False, 1, 2, 1, 0.5], ['B', '2022-09-08', False, 3, 3, 1, 0.5],
['B', '2022-09-09', False, 3, 4, 2, -1], ['B', '2022-09-10', False, 2, 5, 2, -1]]
df_desired = pd.DataFrame(data = data, columns = ['group', 'date', 'indicator', 'value', 'diff_days', 'id', 'slope'])
group date indicator value diff_days id slope
0 A 2022-09-01 False 2 -3 -1 -0.5
1 A 2022-09-02 False 1 -2 -1 -0.5
2 A 2022-09-03 False 1 -1 -1 -0.5
3 A 2022-09-04 True 3 0 0 0.0
4 A 2022-09-05 False 3 1 1 -1.0
5 A 2022-09-06 False 2 2 1 -1.0
6 A 2022-09-07 False 1 3 1 -1.0
7 A 2022-09-07 False 2 3 2 0.0
8 A 2022-09-08 False 4 4 2 0.0
9 A 2022-09-09 False 2 5 2 0.0
10 B 2022-09-01 False 2 -4 -2 NaN
11 B 2022-09-02 False 2 -3 -1 0.0
12 B 2022-09-03 False 4 -2 -1 0.0
13 B 2022-09-04 False 2 -1 -1 0.0
14 B 2022-09-05 True 2 0 0 0.0
15 B 2022-09-06 False 2 1 1 0.5
16 B 2022-09-07 False 1 2 1 0.5
17 B 2022-09-08 False 3 3 1 0.5
18 B 2022-09-09 False 3 4 2 -1.0
19 B 2022-09-10 False 2 5 2 -1.0
以下是A组的一些解释:
- 行 0,1 和 2 是条件行(第 3 行)之前 (id=-1) 的第一个值,斜率(x=[-3,-2,-1],y=[2,1, 1])=-0.5
- 第 4,5 和 6 行是 (id=1) 条件行(第 3 行)之后的第一个值,斜率(x=[1,2,3],y=[3,2,1])= -1
- 第 7,8 和 9 行是 (id=2) 条件行(第 3 行)之后的第二个值,斜率(x=[3,4,5],y=[2,4,2])= 0
所以我想知道是否有人知道是否可以使用 Pandas
计算条件行每 n 天的斜率?
最佳答案
这可以完成工作,但我不知道是否有更高级的 pandas 做事方式。
groups=['A','B']
indexs=[]
for i in groups:
indexs.append(df.loc[(df['group'] == i )& (df['indicator']== True)].index[0])
id2=[]
id3=[]
for i in groups:
id2=df.loc[(df['group'] == i )].index[:]-indexs[groups.index(i)]
for j in id2:
if j < 0:
id3.append(math.floor(j/n))
elif j>=0:
id3.append(math.ceil(j/n))
df['id']=id3
grady=[]
gradx=[]
SlopeList=[]
for i in groups:
idum=[]
for number in df['id'].loc[(df['group']==i)]:
#unique values in list.
if number not in idum:
idum.append(number)
for k in idum:
grady=df['value'].loc[( df['group'] == i ) &(df['id'] == k ) ]
gradx=df['diff_days'].loc[ (df['group'] == i )&(df['id'] == k ) ]
Xm=slope(grady.tolist(),gradx.tolist()) #average slope
for m in range(0,len(gradx)): #create a suitabily sized list with the average slope value.
SlopeList.append(Xm)
df['slope']=SlopeList
附:我尚未对此代码进行任何单元测试,因此请在使用它之前进行检查。
关于python - 如何使用 Pandas 获取条件行每组每 n 天的斜率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74098617/