根据具有特定条件的上一行中一列的值创建新行 - pandas 或 numpy

2023-12-02

我有一个数据框,如下所示

B_ID   no_show  Session  slot_num  walkin   ns_w   c_ns_w     c_walkin
    1     0.4       S1        1       0.2    0.2    0.2       0.2
    2     0.3       S1        2       0.5   -0.2    0.2       0.7 
    3     0.8       S1        3       0.5    0.3    0.5       1.2  
    4     0.3       S1        4       0.8   -0.5    0.0       2.0
    5     0.6       S1        5       0.4    0.2    0.2       2.4 
    6     0.8       S1        6       0.2    0.6    0.8       2.6 
    7     0.9       S1        7       0.1    0.8    1.4       2.7
    8     0.4       S1        8       0.5   -0.1    1.3       3.2
    9     0.6       S1        9       0.1    0.5    1.8       3.3
    12    0.9       S2        1       0.9    0.0    0.0       0.9
    13    0.5       S2        2       0.4    0.1    0.1       1.3  
    14    0.3       S2        3       0.1    0.2    0.3       1.4    
    15    0.7       S2        4       0.4    0.3    0.6       1.8  
    20    0.7       S2        5       0.1    0.6    1.2       1.9
    16    0.6       S2        6       0.3    0.3    1.5       2.2
    17    0.8       S2        7       0.5    0.3    1.8       2.7
    19    0.3       S2        8       0.8   -0.5    1.3       3.5

where,

df[ns_w] = df['no_show'] - df['walkin']

c_ns_w = cumulaitve of ns_w

df['c_ns_w'] = df.groupby(['Session'])['ns_w'].cumsum()

c_walkin = cumulative of walkin

df['c_walkin'] = df.groupby(['Session'])['walkin'].cumsum()

从上面我想计算两列称为u_ns_w and u_c_walkin.

每当u_c_walkin > 0.9创建一个新行no_show = 0, walkin=0所有其他值将与上面的行相同。在哪里B_ID = walkin1, 2, etc,并减去1从上面u_c_walkin.

同时每当u_c_ns_w > 0.8添加一个新行B_ID = overbook1, 2 etc, with no_show = 0.5, walkin=0, ns_w = 0.5以及所有其他值与上面行相同并减去0.5从上面u_c_ns_w.

预期输出:

B_ID   no_show  Session  slot_num  walkin   ns_w   c_ns_w  c_walkin  u_c_walkin  u_c_ns_w
    1     0.4       S1        1       0.2    0.2    0.2    0.2       0.2          0.2
    2     0.3       S1        2       0.5   -0.2    0.2    0.7       0.7          0.2
    3     0.8       S1        3       0.5    0.3    0.5    1.2       1.2          0.5
walkin1   0.0       S1        3       0.0    0.3    0.5    1.2       0.2          0.5
    4     0.3       S1        4       0.8   -0.5    0.0    2.0       1.0          0.0
walkin2   0.0       S1        4       0.0   -0.5    0.0    2.0       0.0          0.0
    5     0.6       S1        5       0.4    0.2    0.2    2.4       0.4          0.2
    6     0.8       S1        6       0.2    0.6    0.8    2.6       0.6          0.8
    7     0.9       S1        7       0.1    0.8    1.4    2.7       0.7          1.4
overbook1 0.5       S1        7       0.0    0.5    1.4    2.7       0.7          0.9
    8     0.4       S1        8       0.5   -0.1    1.3    3.2       1.2          0.8
walkin3   0.0       S1        8       0.0   -0.1    1.3    3.2       0.2          0.8
    9     0.6       S1        9       0.1    0.5    1.8    3.3       0.1          1.3
overbook2 0.5       S1        9       0.0    0.5    1.8    3.3       0.1          0.8
    12    0.9       S2        1       0.9    0.0    0.0    0.9       0.9          0.0     
    13    0.5       S2        2       0.4    0.1    0.1    1.3       1.3          0.1
walkin1   0.0       S2        2       0.0    0.1    0.1    1.3       0.3          0.1
    14    0.3       S2        3       0.1    0.2    0.3    1.4       0.4          0.3
    15    0.7       S2        4       0.4    0.3    0.6    1.8       0.8          0.6
    20    0.7       S2        5       0.1    0.6    1.2    1.9       0.9          1.2
overbook1 0.5       S2        5       0.0    0.5    1.2    1.9       0.9          0.7
    16    0.6       S2        6       0.3    0.3    1.5    2.2       1.2          1.0
walkin2   0.0       S2        6       0.3    0.3    1.5    2.2       0.2          1.0
overbook2 0.5       S2        6       0.0    0.5    1.5    2.2       0.2          0.5
    17    0.8       S2        7       0.5    0.3    1.8    2.7       0.7          0.8
    19    0.3       S2        8       0.8   -0.5    1.3    3.5       1.5          0.3
walkin3   0.0       S2        8       0.8   -0.5    1.3    3.5       0.5          0.3

我尝试使用下面的代码来创建步行行,但无法创建超额预订行。

def create_u_columns (ser):
    l_index = []
    arr_ns = ser.to_numpy()
    # array for latter insert
    arr_idx = np.zeros(len(ser), dtype=int)
    walkin_id = 1
    for i in range(len(arr_ns)-1):
        if arr_ns[i]>0.8:
            # remove 1 to u_no_show
            arr_ns[i+1:] -= 1
            # increment later idx to add
            arr_idx[i] = walkin_id
            walkin_id +=1
    #return a dataframe with both columns
    return pd.DataFrame({'u_cumulative': arr_ns, 'mask_idx':arr_idx}, index=ser.index)

df[['u_c_walkin', 'mask_idx']]= df.groupby(['Session'])['c_walkin'].apply(create_u_columns)


# select the rows
df_toAdd = df.loc[df['mask_idx'].astype(bool), :].copy()
# replace the values as wanted
df_toAdd['no_show'] = 0
df_toAdd['walkin'] = 0
df_toAdd['EpisodeNumber'] = 'walkin'+df_toAdd['mask_idx'].astype(str)
df_toAdd['u_c_walkin'] -= 1
# add 0.5 to index for later sort
df_toAdd.index += 0.5 

new_df = pd.concat([df,df_toAdd]).sort_index()\
           .reset_index(drop=True).drop('mask_idx', axis=1)

这里你可以这样修改函数以同时进行这两项检查。请检查这是否正是您想要应用于walkin和超额预订数据框的条件。

def create_columns(dfg):
    arr_walkin = dfg['c_walkin'].to_numpy()
    arr_ns = dfg['c_ns_w'].to_numpy()
    # array for latter insert
    arr_idx_walkin = np.zeros(len(arr_walkin), dtype=int)
    arr_idx_ns = np.zeros(len(arr_ns), dtype=int)
    walkin_id = 1
    oberbook_id = 1
    for i in range(len(arr_ns)):
        # condition on c_walkin
        if arr_walkin[i]>0.9:
            # remove 1 to u_no_show
            arr_walkin[i+1:] -= 1
            # increment later idx to add
            arr_idx_walkin[i] = walkin_id
            walkin_id +=1
        # condition on c_ns_w
        if arr_ns[i]>0.8:
            # remove 1 to u_no_show
            arr_ns[i+1:] -= 0.5
            # increment later idx to add
            arr_idx_ns[i] = oberbook_id
            oberbook_id +=1
    #return a dataframe with both columns
    return pd.DataFrame({'u_c_walkin': arr_walkin, 
                         'u_c_ns_w': arr_ns,
                         'mask_idx_walkin':arr_idx_walkin, 
                         'mask_idx_ns': arr_idx_ns }, index=dfg.index)

df[['u_c_walkin', 'u_c_ns_w', 'mask_idx_walkin', 'mask_idx_ns']]=\
   df.groupby(['Session'])[['c_walkin', 'c_ns_w']].apply(create_columns)


# select the rows for walkin
df_walkin = df.loc[df['mask_idx_walkin'].astype(bool), :].copy()
# replace the values as wanted
df_walkin['no_show'] = 0
df_walkin['walkin'] = 0
df_walkin['B_ID'] = 'walkin'+df_walkin['mask_idx_walkin'].astype(str)
df_walkin['u_c_walkin'] -= 1
# add 0.5 to index for later sort
df_walkin.index += 0.2 

# select the rows for ns_w
df_ns = df.loc[df['mask_idx_ns'].astype(bool), :].copy()
# replace the values as wanted
df_ns['no_show'] = 0.5
df_ns['walkin'] = 0
df_ns['ns_w'] = 0.5
df_ns['B_ID'] = 'overbook'+df_ns['mask_idx_ns'].astype(str)
df_ns['u_c_ns_w'] -= 0.5
# add 0.5 to index for later sort
df_ns.index += 0.4

new_df = pd.concat([df,df_walkin, df_ns]).sort_index()\
           .reset_index(drop=True).drop(['mask_idx_walkin','mask_idx_ns'], axis=1)

你得到:

print (new_df)
         B_ID  no_show Session  slot_num  walkin  ns_w  c_ns_w  c_walkin  \
0           1      0.4      S1         1     0.2   0.2     0.2       0.2   
1           2      0.3      S1         2     0.5  -0.2     0.2       0.7   
2           3      0.8      S1         3     0.5   0.3     0.5       1.2   
3     walkin1      0.0      S1         3     0.0   0.3     0.5       1.2   
4           4      0.3      S1         4     0.8  -0.5     0.0       2.0   
5     walkin2      0.0      S1         4     0.0  -0.5     0.0       2.0   
6           5      0.6      S1         5     0.4   0.2     0.2       2.4   
7           6      0.8      S1         6     0.2   0.6     0.8       2.6   
8           7      0.9      S1         7     0.1   0.8     1.4       2.7   
9   overbook1      0.5      S1         7     0.0   0.5     1.4       2.7   
10          8      0.4      S1         8     0.5  -0.1     1.3       3.2   
11    walkin3      0.0      S1         8     0.0  -0.1     1.3       3.2   
12          9      0.6      S1         9     0.1   0.5     1.8       3.3   
13  overbook2      0.5      S1         9     0.0   0.5     1.8       3.3   
14         12      0.9      S2         1     0.9   0.0     0.0       0.9   
15         13      0.5      S2         2     0.4   0.1     0.1       1.3   
16    walkin1      0.0      S2         2     0.0   0.1     0.1       1.3   
17         14      0.3      S2         3     0.1   0.2     0.3       1.4   
18         15      0.7      S2         4     0.4   0.3     0.6       1.8   
19         20      0.7      S2         5     0.1   0.6     1.2       1.9   
20  overbook1      0.5      S2         5     0.0   0.5     1.2       1.9   
21         16      0.6      S2         6     0.3   0.3     1.5       2.2   
22    walkin2      0.0      S2         6     0.0   0.3     1.5       2.2   
23  overbook2      0.5      S2         6     0.0   0.5     1.5       2.2   
24         17      0.8      S2         7     0.5   0.3     1.8       2.7   
25         19      0.3      S2         8     0.8  -0.5     1.3       3.5   
26    walkin3      0.0      S2         8     0.0  -0.5     1.3       3.5   

    u_c_walkin  u_c_ns_w  
0          0.2       0.2  
1          0.7       0.2  
2          1.2       0.5  
3          0.2       0.5  
4          1.0       0.0  
5          0.0       0.0  
6          0.4       0.2  
7          0.6       0.8  
8          0.7       1.4  
9          0.7       0.9  
10         1.2       0.8  
11         0.2       0.8  
12         0.3       1.3  
13         0.3       0.8  
14         0.9       0.0  
15         1.3       0.1  
16         0.3       0.1  
17         0.4       0.3  
18         0.8       0.6  
19         0.9       1.2  
20         0.9       0.7  
21         1.2       1.0  
22         0.2       1.0  
23         1.2       0.5  
24         0.7       0.8  
25         1.5       0.3  
26         0.5       0.3 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据具有特定条件的上一行中一列的值创建新行 - pandas 或 numpy 的相关文章

随机推荐

  • VBA隐藏用户表单但保留输入的数据

    我带着我希望是一个相当简单的问题再次回来 我正在尝试在 VBA 中创建用户表单 用户将在表单中输入某些信息 然后关闭表单 我希望用户表单在用户关闭后保留输入的数据 我将它视为一个类模块 因为从技术上讲它们是 或者至少我是这么理解的 这是我正
  • AWS EC2 Angular 5 ng服务不通过浏览器连接

    我设法让我的 Angular 5 应用程序在 AWS EC2 Ubuntu 上运行 启动标准Ubuntu实例 使用PuTTy加壳 安装节点 进入接下来的4条 魔线 mkdir npm global npm config set prefix
  • 具有可变结尾整数的 For 循环

    我有一个包含 40 000 行数据的数据集 我的代码设置为检查第 n 1 行中的日期是否比第 n 行中的日期晚 1 天 如果第 n 行和第 n 1 行中的日期不按正常时间顺序排列 则会添加包含该日期的空白数据的行 我的问题是 因为我在添加行
  • Selenium / java:如何获取总页长度

    使用 Selenium Java 绑定 我正在尝试编写一个简短的模块 它将截取浏览器页面的完整屏幕截图 我知道AShot存在 但没有维护 并且对我来说有一些问题 作为其中的一部分 我想知道我正在处理的整页长度是多少 这样我就可以计算出需要拍
  • 如何在 r markdown 中指定自定义纸张尺寸

    我正在使用 R Markdown 制作一本具有特定高度和长度测量值的小册子 有没有办法指定 R Markdown 以 5 5 x8 5 尺寸生成文章 我看到有关制作 A4 尺寸 pdf 的问题here但这并没有帮助 因为我的措施非常具体 使
  • Java JScrollPane - 多个组件

    我正在尝试在 JScrollPane 中添加 2 个图像 第一个图像是背景 第二个图像与第一个图像重叠 当我运行程序时 问题仅显示第二张图像 请帮忙 ImageIcon ii new ImageIcon mini map png JLabe
  • “一个实体对象不能被 IEntityChangeTracker 的多个实例引用。”

    我使用 MYSql 服务器作为 Windows 窗体应用程序背后的数据库 我的数据库中有两个模式 我必须将条目放入其中 我创建了两个上下文对象 每个对象对应一个模式 当我使用 schema1 上的 contextA 时 所有条目都完美完成
  • 如何将双引号或单引号或不带引号与正则表达式匹配?

    我试图从所有三种类型的输入中获取一些文本 但无法弄清楚如何处理未引用的情况 到目前为止我有 name Input name sometext name sometext name sometext 看起来您是一名 C 开发人员 因此您可以使
  • 安装 Pillow(和 PIL)时出错

    如果我使用命令sudo pip install Pillow 它运行良好 直到清理阶段 这是日志文件中的完整错误消息 clang error unknown argument mno fused madd Wunused command l
  • Apple APP Store 上启用 Bitcode 的移动应用程序大小

    我是新人 尝试在 App Store 上发布我的第一个应用程序 我已经制作了这个应用程序统一 5 6 我面临的问题是生成的存档的大小Xcode 8 3 我必须在 App Store 上上传 它超过 100 MB 而 Play 商店上的同一个
  • 在 Android 中复制 Apple 的搜索

    我想创建一个类似于此处所示的 UIhttp appsreviews com wp content uploads 2010 08 Cures A Z App for iPhone jpg 我开始尝试将两个自定义列表并排放置 就像在这段代码中
  • 将日期时间打印为 pytz.timezone("Etc/GMT-5") 会产生不正确的结果

    考虑以下示例 其中我采用一个简单的日期时间 使其能够识别 UTC 时区 然后转换为 UTC 5 d1 datetime datetime 2019 3 7 7 45 d2 pytz utc localize d1 print f UTC d
  • 如何使用 JFreeChart 创建条形图,通过可见的提示缩短太长的条形图?

    我想创建一个条形图 但是应该缩短非常高的值 下图就是一个例子 source epa gov 我希望我想要的很清楚 我的问题是 我怎样才能做到这一点自由图表 如果 JFreeChart 无法实现 您可以推荐替代的开源 Java 库来生成此类输
  • pandas 按周分组

    我有这个数据框 Name Date Quantity Apple 07 11 17 20 orange 07 14 17 20 Apple 07 14 17 70 Orange 07 25 17 40 Apple 07 20 17 30 我
  • 格式化 posix 时间,仅包含 3 位小数秒数

    相当于什么microsec clock以下代码中的毫秒数 include
  • 如何将 HTML 读取为 XML?

    我想从从互联网下载的 html 页面中提取几个链接 我认为使用 linq to XML 对于我的情况来说是一个很好的解决方案 我的问题是我无法从 HTML 创建 XmlDocument 使用 Load string url 不起作用 所以我
  • 设置 leftBarButtonItem 后如何在 UINavigationController 中启用后退/向左滑动手势?

    我得到了相反的问题here 默认情况下iOS7 向后滑动手势UINavigationController的堆栈可以弹出呈现的ViewController 现在我只是制服了所有self navigationItem leftBarButton
  • 如何使用 JPA/EclipseLink 设置与连接表的多对多关系

    我有 2 张桌子 电影 电影ID 用户 用户身份 这些表通过队列表具有多对多的关系 附加属性 listOrder 队列 电影ID 用户身份 列表顺序 我正在尝试使用 EclipseLink 对此进行建模 但是得到了一个 映射不兼容 错误 这
  • Spring MVC - 打开新页面而不重新加载

    我有一个使用 Sring MVC 和 Sitemesh 设置的小应用程序 当我单击链接 表单等时 我希望它打开新页面而不重新加载整个装饰器页面 仅加载装饰器 主体部分 有什么简单的方法可以做到这一点吗 唯一的方法是使用AJAX用于获取页面部
  • 根据具有特定条件的上一行中一列的值创建新行 - pandas 或 numpy

    我有一个数据框 如下所示 B ID no show Session slot num walkin ns w c ns w c walkin 1 0 4 S1 1 0 2 0 2 0 2 0 2 2 0 3 S1 2 0 5 0 2 0 2