Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “如何计数”;实际的;数据帧中的行?_Python_Pandas - Fatal编程技术网

Python “如何计数”;实际的;数据帧中的行?

Python “如何计数”;实际的;数据帧中的行?,python,pandas,Python,Pandas,我的数据集中有以下列: id |用户id |开始日期|结束日期|检查日期 我想从第一列获取检查日期,查找检查日期在开始日期和结束日期之间的所有行。然后计算每个用户id的行数。对第二行执行相同的操作,依此类推 这里的要点是,我将得到每个用户和每个检查日期的所有实际行的数量 这是我的解决方案(在我的数据集中,我的检查日期少于用户): 请提供一些示例测试数据,以便我们重现您的问题。您是否接受创建一个带有id和check_date值计数为True的dict作为答案?例如:{'id':[1,2,3,4],

我的数据集中有以下列:

id |用户id |开始日期|结束日期|检查日期

我想从第一列获取检查日期,查找检查日期开始日期结束日期之间的所有行。然后计算每个用户id的行数。对第二行执行相同的操作,依此类推

这里的要点是,我将得到每个用户和每个检查日期的所有实际行的数量

这是我的解决方案(在我的数据集中,我的检查日期少于用户):


请提供一些示例测试数据,以便我们重现您的问题。您是否接受创建一个带有id和check_date值计数为True的dict作为答案?例如:{'id':[1,2,3,4],'dates_in_between':[10,23,13,42]}@d_kennetz,编辑了我的问题谢谢你的回答,但这不是我需要的。在查询中,您正在检查check_date是否在同一行的开始和结束之间。我想查找当前行的check_date在开始和结束之间的所有行。“实际”列是此操作的结果。编辑以匹配示例和结果
df['actual_rows'] = 0
for c_d in df.check_date.unique():
  temp_df = df[(start_date <= c_d) & (end_date > c_d)]
  gr = temp_df.groupby('user_id')['id'].count()
  df.loc[df.check_date == c_d, 'actual_rows'] =\
                     df[df.check_date == c_d].user_id.map(gr.to_dict()) 
  del temp_df 
  del gr
id, user_id, start_date, end_date, check_date, actual
1, 1, 2018-11-05, 2018-12-06, 2018-11-22, 2
2, 1, 2018-11-10, 2018-11-25, 2018-11-24, 2
3, 1, 2018-12-05, 2018-12-31, 2018-12-20, 1
4, 1, 2018-12-25, 2019-01-30, 2018-12-30, 2
import pandas as pd
from io import StringIO

# example data (with result column and spaces removed, a few rows added)   
df = pd.read_csv(StringIO("""id,user_id,start_date,end_date,check_date
1,1,2018-11-05,2018-12-06,2018-11-22
2,1,2018-11-10,2018-11-25,2018-11-24
3,1,2018-12-05,2018-12-31,2018-12-20
4,1,2018-12-25,2019-01-30,2018-12-30
5,2,2018-11-05,2018-12-06,2018-11-22
6,2,2018-11-10,2018-11-25,2018-11-24
"""))

def count_for_check_date(df, user_id, check_date):
    """
    :return: count of rows in df for given user_id and check_date
    """
    return df.query('user_id == @user_id and start_date <= @check_date and @check_date <= end_date').shape[0]

# apply the counting function to each pair of [user_id, checkdate] - assign result to column actual
df['actual'] = df[['user_id','check_date']].apply(lambda r: count_for_check_date(df, r[0], r[1]), axis=1)

print(df)
   id  user_id  start_date    end_date  check_date  actual
0   1        1  2018-11-05  2018-12-06  2018-11-22       2
1   2        1  2018-11-10  2018-11-25  2018-11-24       2
2   3        1  2018-12-05  2018-12-31  2018-12-20       1
3   4        1  2018-12-25  2019-01-30  2018-12-30       2
4   5        2  2018-11-05  2018-12-06  2018-11-22       2
5   6        2  2018-11-10  2018-11-25  2018-11-24       2