Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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_Dataframe_Runtime_Iteration - Fatal编程技术网

Python 如何制作;值位于日期框列“中”;更快

Python 如何制作;值位于日期框列“中”;更快,python,pandas,dataframe,runtime,iteration,Python,Pandas,Dataframe,Runtime,Iteration,我有一个代码,它有userID、categoryID和date作为输入值。我想检查条目是否有效,例如,userID是否存在于我的数据集中。 它按照我的方式工作,但是我必须等待几秒钟(!)直到主程序被执行 var_uid = int(input("Please enter a user ID: ")) var_catid = input("Please enter a category ID: ") var_date = input("Please enter a date to restrict

我有一个代码,它有
userID
categoryID
date
作为输入值。我想检查条目是否有效,例如,
userID
是否存在于我的数据集中。 它按照我的方式工作,但是我必须等待几秒钟(!)直到主程序被执行

var_uid = int(input("Please enter a user ID: "))
var_catid = input("Please enter a category ID: ")
var_date = input("Please enter a date to restrict the considered data (YYYY-MM-DD): ")


if (~var_uid in df_data['UserID'].values) :
    print("There is no such user with this UserID. Please enter a different UserID.")
elif (~df_data['CategoryID'].str.contains(var_catid).any()) :
    print("There is no such category with this CategoryID. Please enter a different CategoryID")
else:
    ### I convert my date to datetime object to be able to do some operations with it. ###
date = pd.to_datetime(var_date)

s_all = df_data[df_data.columns[7]]
s_all_datetime = pd.to_datetime(s_all)
df_data['UTCtime'] = s_all_datetime

min_date_str = "2012-04-03"
min_date = pd.to_datetime(min_date_str)
max_date_str = "2013-02-16"
max_date = pd.to_datetime(max_date_str)


if (date < min_date or date > max_date) :
    print("There is noch such date. Please enter a different date from 2012-04-03 until 2013-02-16")
else:
    some code
不起作用

谢谢你的帮助

/编辑:这里有
df_data.info()
df_data.head()

你这是什么意思

但是df_data['UserID'].unique.tolist()不起作用

?

你是说命令失败了吗?这可能是因为unique是一个函数,您必须调用它

df_data['UserID'].unique().tolist()
还是说它还是太慢了?在这种情况下,您可能不想使用python列表,因为它仍然需要遍历每个条目。如果您改为使用集合,您将有最坏的情况O(logn)检索时间。所以

set(df['UserID'].tolist())

现在,这样可以更快地查找用户,但是如果类别需要更复杂的调用(比如str.contains),您仍然需要查看列表。但是,如果类别的基数小得多,您可能只需对其应用unique并处理较小的列表。

对于此类包含检查,您应该将用户(和类别)作为索引:

if (~var_uid in df_data['UserID'].values) :

elif (~df_data['CategoryID'].str.contains(var_catid).any()) :
一旦这些都在索引中(注意:这应该在该块之外进行,而不是每次):

然后您可以在O(1)中查找:


您可以手动创建这些,同样,您必须执行这些操作一次,而不是每次查找才能获得好处:

pd.Index(df_date["UserID"])
# if lots of non-unique users this will be more space efficient
pd.Index(df_date["UserID"].unique())

考虑创建查找索引,然后获得日志速度访问。下面是一个例子:

import pandas as pd
import numpy as np

n = int(1e6)
np.random.seed(0)
df = pd.DataFrame({
    'uid': np.arange(n), 
    'catid': np.repeat('foo bar baz', n),
})
较慢的版本:

>>> %timeit for i in range(n // 2, n // 2 + 1000): i in df.uid.values
1 loop, best of 3: 2.32 s per loop
但是,您可以预先计算索引:

>>> uids = pd.Index(df.uid.values)
>>> %timeit for i in range(n // 2, n//2 + 1000): i in uids
1000 loops, best of 3: 412 µs per loop
>>> %timeit uids = pd.Index(df.uid.values)
10000 loops, best of 3: 22.5 µs per loop
哇,太快了。让我们看看创建索引需要多长时间:

>>> uids = pd.Index(df.uid.values)
>>> %timeit for i in range(n // 2, n//2 + 1000): i in uids
1000 loops, best of 3: 412 µs per loop
>>> %timeit uids = pd.Index(df.uid.values)
10000 loops, best of 3: 22.5 µs per loop
您也可以使用
set
(尽管对于
UserID
这样的int使用pandas索引更快),例如对于
CategoryID
,您可以预计算:

>>> catids = set(s for catid in df.catid.values for s in catid.split())
然后检查

>>> catid in catids

这将要快得多。

非常感谢所有贡献者!对于我的
UserID
,我使用了将其设置为索引的解决方案。对于我的
类别ID
,我创建了集合并将其存储在我的程序中

此外,我还发现了另一个更糟糕的瓶颈:

s_all = df_data[df_data.columns[7]]
s_all_datetime = pd.to_datetime(s_all)
df_data['UTCtime'] = s_all_datetime
它将我的
'UTCtime'
列转换为日期时间对象。。。230k次迭代与它^^
我只做了一次,现在存储了新的数据帧。每次只需加载.csv,但速度要快得多。

你可以发布
df_data.info()
df.head()
来查看源数据的示例吗?你可以通过
df_data[(df_data['UserID']==var_-uid)和(df_-data['CategoryID']==var_-catid)]
的方式检查它,谢谢你的回复。但是如果我写
if(df_data[(df_data['UserID']!=var_uid)]:
我会得到一个错误,因为真值不明确。谢谢!你的答案是最完整的。
>>> catids = set(s for catid in df.catid.values for s in catid.split())
>>> catid in catids
s_all = df_data[df_data.columns[7]]
s_all_datetime = pd.to_datetime(s_all)
df_data['UTCtime'] = s_all_datetime