繁体   English   中英

数据框中多行的条件累积总和

[英]Conditional Cumulative Sum of Multiple Rows in Dataframe

我正在尝试根据条件查找数据帧中四个连续行的累积总和。

新列( 'veh_time_TOT' )是四个连续的' veh_time(s) '值的总和,条件为' Day_type ':周末或工作日。

现在是如何设置数据的:

    veh-time(s) distance(m) Day_type
0   72  379.0   Weekday
1   70  379.0   Weekday
2   50  379.0   Weekday
3   60  379.0   Weekday
4   70  379.0   Weekday
5   65  379.0   Weekday
6   30  379.0   Weekend
7   35  379.0   Weekend
8   30  379.0   Weekend
9   30  379.0   Weekend
10  20  379.0   Weekend 

这是所需的输出:

    veh-time(s) distance(m) Day_type    veh_time_TOT
0   72  379.0   Weekday        0
1   70  379.0   Weekday        0
2   50  379.0   Weekday        0
3   60  379.0   Weekday        252
4   70  379.0   Weekday        250
5   65  379.0   Weekday        245
6   30  379.0   Weekend        0
7   35  379.0   Weekend        0
8   30  379.0   Weekend        0
9   30  379.0   Weekend        125
10  20  379.0   Weekend        115  

我已经尝试了几件事,但是我唯一能找到的就是使用.cumsum函数,该函数只能找到2个连续行的总和。 veh_time_TOT ”中的零是存在的,因为还没有4行可以组成总和。

我认为这将是.cumsum和条件if语句在循环中的组合。

你们有什么感想? 任何帮助表示赞赏。

这是我获取所需列所采取的步骤:

  • 首先,我设置您的示例DataFrame。

  • 接下来,我定义了三个感兴趣的列(其值将作为计算基础的列,用于比较的列以及所计算数量的列名称。

  • 之后,我找到了所有可用于此计算的行(之前的4行的col_compare值相同)。
  • 然后,我遍历原始DataFrame的这一部分,将col_val的前四个值col_val

  • 最后,我用所需的名称col_name_new创建新列。

    • 将其值初始化为零
    • 使用我们在上一步中生成的列表填充符合条件的位置:

这是我的代码,请随时在评论中询问Q!

import pandas as pd

# Setup

cols = ['veh-time(s)', 'distance(m)', 'Day_type']

data= [[72,  379.0 ,  'Weekday'],
       [70,  379.0 ,  'Weekday'],
       [50,  379.0 ,  'Weekday'],
       [60,  379.0 ,  'Weekday'],
       [70,  379.0 ,  'Weekday'],
       [65,  379.0 ,  'Weekday'],
       [30,  379.0 ,  'Weekend'],
       [35,  379.0 ,  'Weekend'],
       [30,  379.0 ,  'Weekend'],
       [30,  379.0 ,  'Weekend'],
       [20,  379.0 ,  'Weekend']]


df = pd.DataFrame(data,columns=cols )

# Define columns for potential future generalization

col_val='veh-time(s)'
col_compare='Day_type'
col_name_new = 'veh_time_TOT'

# DataFrame slice of rows eligible for calculation

cut_prev_four =  (df[col_compare].shift(1)==df[col_compare]) \
                &(df[col_compare].shift(2)==df[col_compare].shift(1)) \
                &(df[col_compare].shift(3)==df[col_compare].shift(2))

df_consecutive = df[cut_prev_four]

# Perform calculation on eligible rows. Store in list

prev_four_list = []
for i,row in df_consecutive.iterrows():
    prev_four_vals = df.iloc[i-3:i+1][col_val].values
    print(i, prev_four_vals, sum(prev_four_vals) )
    prev_four_list.append(sum(prev_four_vals))

# Set new column to the calculated values

df[col_name_new] = 0
df.loc[cut_prev_four, col_name_new] = prev_four_list

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM