Python用反向coun追加行号

2024-04-25 13:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我还有一个问题。这一点可能可以通过一个循环来实现,但是我正在寻找一个更精简的解决方案

假设我有这样一个数据帧:

enter image description here

我正在寻找一个代码来生成列ID,它只不过是一个降序计数器,当列销售值发生变化时-即,对于每个销售人员,我想让ID列检索销售值发生变化前的剩余天数。 例如,在2018年1月1日,销售员Joe的ID=2,因为信号在2天内发生变化。你知道吗

有什么办法解决这个问题吗?你知道吗

非常感谢。 日本


Tags: 数据代码id信号人员计数器解决方案精简
1条回答
网友
1楼 · 发布于 2024-04-25 13:22:42

设置:

df = pd.DataFrame([
    pd.Series(pd.date_range('1/1/2018', '1/7/2018').append(pd.date_range('1/1/2018', '1/7/2018'))),
    pd.Series(['Joe']*7 + ['Helen']*7),
    pd.Series([1,1,0,0,0,0,1,0,1,1,0,1,0,0]),
]).T
df.columns = ['date', 'salesman', 'sold']
df['date'] = pd.to_datetime(df['date'])

计算:

df['changes'] = df.groupby('salesman')['sold'].expanding().apply(lambda x: (np.diff(x) != 0).sum()).reset_index(drop = True)

df['id'] = df.groupby(['salesman', 'changes']).apply(lambda grp: pd.Series(len(grp) - grp.sort_values('date').reset_index().index)).reset_index(drop = True)

df.drop('changes', axis = 1, inplace = True)

结果:

>>> df


    date    salesman  sold  id
0   2018-01-01  Joe     1   2
1   2018-01-02  Joe     1   1
2   2018-01-03  Joe     0   4
3   2018-01-04  Joe     0   3
4   2018-01-05  Joe     0   2
5   2018-01-06  Joe     0   1
6   2018-01-07  Joe     1   1
7   2018-01-01  Helen   0   1
8   2018-01-02  Helen   1   2
9   2018-01-03  Helen   1   1
10  2018-01-04  Helen   0   1
11  2018-01-05  Helen   1   1
12  2018-01-06  Helen   0   2
13  2018-01-07  Helen   0   1

说明:

创建一个'changes'列,该列在每个销售人员的'sold字段每次更改时递增。然后,对于每个增量组(仍按salesperson分组),获取该组的长度(等于该值的后续行的长度),并从该值中减去每行的索引,按日期排序。减法的结果将是一个从组的长度下降到1的序列。重置索引并合并回原始数据帧。这是一个有点混乱的解决办法,但它应该工作。你知道吗

相关问题 更多 >