为了账号安全,请及时绑定邮箱和手机立即绑定

根据其他列的查找设置列值

根据其他列的查找设置列值

慕哥9229398 2022-06-28 16:00:17
我有一个DataFrame,其中包含dates、categories和一列,该列显示该类别是否发生了一次性事件。我想创建一个新列,其中包含事件发生之前的时间,或者某个指标没有事件,例如负时间。数据集非常大,我想有一个更好的解决方案,而不是使用 Pandas 更好的人会知道的循环暴力破解它!所以,简而言之,如果我这样创建我的数据集:import pandas as pd#create example datasetdata = {'categories':['a','b','c']*4,'dates':[i for i in range(4) for j in range(3)],'event':[0]*3*4}#add a couple of eventsdata['event'][4] = 1data['event'][9] = 1df = pd.DataFrame(data)我怎样才能最好地得到这样的输出?   categories  dates  event  time_until0           a      0      0           31           b      0      0           12           c      0      0          -13           a      1      0           24           b      1      1           05           c      1      0          -16           a      2      0           17           b      2      0          -18           c      2      0          -19           a      3      1           010          b      3      0          -111          c      3      0          -1谢谢你的帮助!
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

使用groupby


def f(s):

    s = s.reset_index(drop=True)

    one = s[s.eq(1)]

    if one.empty: return -1

    return -s.index + one.index[0]

df.groupby('categories').event.transform(f)

  categories  dates  event  time_until

0           a      0      0           3

1           b      0      0           1

2           c      0      0          -1

3           a      1      0           2

4           b      1      1           0

5           c      1      0          -1

6           a      2      0           1

7           b      2      0          -1

8           c      2      0          -1

9           a      3      1           0

10          b      3      0          -2

11          c      3      0          -1

请注意,即使在事件发生之后,它也会找到距离。因此,对于以下事件,您将获得以下输出


event = [0, 0, 0, 1, 0, 0]

until = [3, 2, 1, 0, -1, -2]

如果您需要使所有负值保持不变-1,那么只需在最后进行调整


df.time_until.where(df.time_until >= -1, -1)


查看完整回答
反对 回复 2022-06-28
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

替代解决方案:


df.sort_values(by=['categories', 'dates'], ascending=[True, False], inplace=True)

df['tmp'] = df.groupby('categories')['event'].transform('cumsum')

df['time_until'] = df.groupby('categories')['tmp'].transform('cumsum') - 1

df.drop(columns='tmp', inplace=True)

df.sort_values(by=['dates', 'categories'], ascending=[True, True], inplace=True)

输出:


      categories  dates  event  time_until

0           a      0      0           3

1           b      0      0           1

2           c      0      0          -1

3           a      1      0           2

4           b      1      1           0

5           c      1      0          -1

6           a      2      0           1

7           b      2      0          -1

8           c      2      0          -1

9           a      3      1           0

10          b      3      0          -1

11          c      3      0          -1


查看完整回答
反对 回复 2022-06-28
?
三国纷争

TA贡献1804条经验 获得超7个赞

尝试这样的事情:


import pandas as pd

import numpy as np


data = {'categories':['a','b','c']*4,

        'dates':[i for i in range(4) for j in range(3)],

        'event':[0, 1, 0]*4}


df = pd.DataFrame(data)

print(df)


# One way

df.loc[df.event == 0, 'Newevents'] = 'Cancelled'

df.loc[df.event != 0, 'Newevents'] = 'Scheduled'


# Another way

conditions = [

    (df['categories'] == "a"),

    (df['categories'] == "b"),

    (df['categories'] == "c")]

choices = ['None', 'Completed', 'Scheduled']

df['NewCategories'] = np.select(conditions, choices, default='black')

print(df)

输出:


categories  dates  event

0           a      0      0

1           b      0      1

2           c      0      0

3           a      1      0

4           b      1      1

5           c      1      0

6           a      2      0

7           b      2      1

8           c      2      0

9           a      3      0

10          b      3      1

11          c      3      0

categories  dates  event  Newevents NewCategories

0           a      0      0  Cancelled          None

1           b      0      1  Scheduled     Completed

2           c      0      0  Cancelled     Scheduled

3           a      1      0  Cancelled          None

4           b      1      1  Scheduled     Completed

5           c      1      0  Cancelled     Scheduled

6           a      2      0  Cancelled          None

7           b      2      1  Scheduled     Completed

8           c      2      0  Cancelled     Scheduled

9           a      3      0  Cancelled          None

10          b      3      1  Scheduled     Completed

11          c      3      0  Cancelled   


查看完整回答
反对 回复 2022-06-28
  • 3 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信