Python中具有非等连接的Countifs

2024-09-26 22:53:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我被这个问题困扰了很长时间,需要帮助。你知道吗

我在表T1中有400万行的数据。你知道吗

我需要在python中根据以下excel公式计算:

=COUNTIFS(A:A,A2,B:B,"<"&B2,C:C,"<"&C2)

Table Name -T1

User Id Start time  End time    Count  
A1  10-01-2018 10:15    10-01-2018 12:15    0  
A2  10-01-2018 10:45    10-01-2018 11:15    0  
A1  10-01-2018 10:25    10-01-2018 13:30    1  
A2  10-01-2018 11:00    10-01-2018 11:40    1

最终结果是Count列

我试过下面的方法,在这两种情况下,我得到一个内存错误。你知道吗

有什么方法可以做到这一点:

  1. pysqldf("SELECT T1.,count() FROM T1 a left join T1 b on a.user_id=b.user_id and a.start_time>b.start_time and a.end_time>b.end_time group by 1,2,3")

  2. 合并然后过滤(python不允许在合并中使用非相等联接)


Tags: and数据方法ida2timea1count
1条回答
网友
1楼 · 发布于 2024-09-26 22:53:13

您可以使用pandas实现这一点

import pandas as pd

fmt = '%m-%d-%Y %H:%M'
columns = ['Users', 'Start Time', 'End Time', 'Count']

df = pd.read_excel('filename.xlsx', sheetname="Sheet1")
df.columns=columns

#get the start dates less than the first
df1=df[df['Start Time']<df.iloc[0]['Start Time']]
#get the end dates less than the first
df2=df[df['End Time']<df.iloc[0]['End Time']]

#find matching rows between df1 and df2
df3 = pd.merge(df1, df2, on=columns, how='inner')
print(df3)

我在下面的数据上运行了这个

A1   10-01-2018 10:15   10-01-2018 12:15   0
A2   10-01-2018 10:45   10-01-2018 11:15   0 
A3   10-01-2018 10:25   10-01-2018 13:30   1
A4   10-01-2018 11:00   10-01-2018 11:40   1
A5   10-01-2018 10:00   10-01-2018 11:15   0

这张照片:

  Users        Start Time          End Time  Count
0    A5  10-01-2018 10:00  10-01-2018 11:15      0

如果您想在python dict中重新使用它,只需使用:

df3.set_index('Users').T.to_dict('dict')
#{'A5': {'Start Time': '10-01-2018 10:00', 'End Time': '10-01-2018 11:15','Count': 0}}

编辑

我的电脑上没有excel,而且我很难破译excel公式。如果上面的代码除了对用户进行约束之外,还做了您想做的事情,那么就把它放在我定义df1df2的地方。这限制了特定用户。你知道吗

df = df[df.Users == 'A1']

然后要获得这些过滤器之后的所有过滤器的计数:

df3.shape()[0]

相关问题 更多 >

    热门问题