我已经遇到这个问题很长时间了,需要这方面的帮助。
我在表 T1 中有以下数据,有 400 万行。
我需要根据以下 excel 公式在 python 中计数:
=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
最终结果为"计数"列
我尝试了以下方法,在这两种情况下我都遇到了内存错误。
有什么方法可以做到这一点:
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")
合并然后过滤(Python 不允许合并中的非相等连接)
您可以使用熊猫完成此操作
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 公式时遇到了麻烦。如果上面的代码除了约束用户之外执行您想要的操作,则将其放在我定义df1
和df2
的位置上方。这限制了特定用户。
df = df[df.Users == 'A1']
然后,要获取这些筛选器之后的所有计数,请执行以下操作:
df3.shape()[0]