pandas 行元素之间更改的滚动计数

ozxc1zmp  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(132)

我有一个数据框,如下所示:
| 鉴定|日期(日/月/年)|X轴|Y型|
| - -|- -|- -|- -|
| 一百二十三|2022年1月1日|100个|abc公司|
| 一百二十三|2022年2月1日|二百个|乙酰胆碱|
| 一百二十三|2022年3月1日|三百个|阿里|
| 一百二十四|2022年1月1日|二百个|abc公司|
| 一百二十四|2022年2月1日|九百人|abc公司|
| 一百二十四|2022年3月1日|九百人|abc公司|
我尝试创建两个单独的“change”列,一个分别代表x和y,这是一个滚动计数,记录给定元素随时间变化的次数。我希望输出如下所示:
| 鉴定|日期(日/月/年)|X轴|Y型|变更X|变更Y|
| - -|- -|- -|- -|- -|- -|
| 一百二十三|2022年1月1日|100个|abc公司|第0页|第0页|
| 一百二十三|2022年2月1日|二百个|乙酰胆碱|一个|一个|
| 一百二十三|2022年3月1日|三百个|阿里|2个|2个|
| 一百二十四|2022年1月1日|二百个|abc公司|第0页|第0页|
| 一百二十四|2022年2月1日|九百人|abc公司|一个|第0页|
| 一百二十四|2022年3月1日|九百人|abc公司|第0页|第0页|
如有任何帮助,我们将不胜感激!
谢谢你:)

byqmnocz

byqmnocz1#

这不是最佳的性能,但可以完成工作:

def consec_count(arr):
    total = 0
    out = np.zeros(len(arr), dtype=np.int32)
    acc = arr[0]
    for idx, el in enumerate(arr):
        if el == acc or el == np.nan or el == pd.NA:
            total = 0
        else:
            total += 1
            acc = el
        out[idx] = total
    return out

df[['Change X', 'Change Y']] = df.groupby('Identification', 
                                   group_keys=False)[['X', 'Y']].transform(
                                                        lambda x : consec_count(x.values))

而输出:

Identification Date (day/month/year)    X    Y  Change X  Change Y
0             123            01/01/2022  100  abc         0         0
1             123            02/01/2022  200  acb         1         1
2             123            03/01/2022  300  ary         2         2
3             124            01/01/2022  200  abc         0         0
4             124            02/01/2022  900  abc         1         0
5             124            03/01/2022  900  abc         0         0
9w11ddsr

9w11ddsr2#

下面是另一种方法:

from itertools import accumulate
import pandas as pd

for col in df.columns[2:]:
    df[f'Change {col}'] = None
    for id, group in df.groupby('Identification'):
        df.loc[df['Identification'] == id, f'Change {col}'] = \
            list(accumulate(group.index[:-1], lambda x, y: x + 1 if group.loc[y, col] != group.loc[y + 1, col] else 0, initial=0))

df

   Identification Date(day/month/year)    X    Y Change X Change Y
0             123           01/01/2022  100  abc        0        0
1             123           02/01/2022  200  acb        1        1
2             123           03/01/2022  300  ary        2        2
3             124           01/01/2022  200  abc        0        0
4             124           02/01/2022  900  abc        1        0
5             124           03/01/2022  900  abc        0        0

相关问题