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

Python 为什么不是';这两组运算之间的顺序不变性是什么?

Python 为什么不是';这两组运算之间的顺序不变性是什么?,python,pandas,numpy,dataframe,data-science,Python,Pandas,Numpy,Dataframe,Data Science,我正在处理一个CSV文件/dataframe,其中第一列包含日期。 我想在这里做一些到datetime的转换,一些过滤,排序和重新索引 我的经验是,如果我改变操作集的顺序,我会得到不同的结果(第一个配置的结果比另一个配置的结果大)。第一个可能是“好”的 谁能告诉我,哪些子操作导致结果之间的差异 哪一个是“坏”的,哪一个是“好”的解决方案 如果用户可以以任意顺序调用这两个方法,并且仍然获得良好的结果,那么是否可能实现安全的顺序独立性?(通过实施可互换的操作集是否可能获得良好的结果?) 配置1: #

我正在处理一个CSV文件/dataframe,其中第一列包含日期。 我想在这里做一些到datetime的转换,一些过滤,排序和重新索引

我的经验是,如果我改变操作集的顺序,我会得到不同的结果(第一个配置的结果比另一个配置的结果大)。第一个可能是“好”的

谁能告诉我,哪些子操作导致结果之间的差异

哪一个是“坏”的,哪一个是“好”的解决方案

如果用户可以以任意顺序调用这两个方法,并且仍然获得良好的结果,那么是否可能实现安全的顺序独立性?(通过实施可互换的操作集是否可能获得良好的结果?)

配置1:

# Operation set 1: dropping duplicates, sorting and reindexing the table
jdf1.drop_duplicates(subset=dateColName, inplace=True)
jdf1.sort_values(dateColName, inplace=True)
jdf1.reset_index(drop=True, inplace=True)

# Operatrion set 2: converting column type and filtering the rows in case of CSV's contents are covering a wider interval
jdf1[dateColName] = pd.to_datetime(jdf1[jdf1.columns[0]], format="%Y-%m-%d")
maskL = jdf1[dateColName] < interval[0]
maskR = jdf1[dateColName] > interval[1]
mask = maskL | maskR
jdf1.drop(jdf1[mask].index, inplace=True)

谢谢你的帮助

乍一看是一样的,但不是

因为有两种不同的过滤方式相互影响:

drop_duplicates() -> remove M rows, together ALL rows - M
boolean indexing with mask -> remove N rows, together ALL - M - N
--

若交换这个操作,结果应该是不同的,因为两者都会删除行。调用它们的顺序很重要,因为有些行只删除drop_重复项,有些行只删除布尔索引


我认为这两种方法都是正确的,这取决于需要什么。

你能提供一些数据吗?
df.to_json()
的输出,最好是一个小到足以重现问题的样本。我在一个更大(预处理)的数据集上遇到过这个问题,小规模重现问题或从环境中获取数据并不容易。我使用的数据集与此类似(请将数据格式更改为:'%d-%b-%y')OP正在查看值列表,删除重复项并保留在某个间隔内的值。你能举一个操作顺序影响结果的例子吗?我认为你的第一行在这里是不正确的,应该是这样的:drop_duplicates()->删除M行,所有行一起-MIf我正确理解你的例子,你的意思是:size(K)~!=尺寸(M),尺寸(L)~!=尺寸(N),尺寸(K)~!=尺寸(L),尺寸(M)~!=大小(N),其中“~!=”运算符的意思是:“不一定等于”,但我期望的是:大小(K+M),但在这种情况下,两个运算符集的执行顺序应该是不相关的。我说的对吗?不知道你是否理解。但操作顺序是从代码的第1行到最后一行,如果不是for、while、if语句的话。
# Operatrion set 2: converting column type and filtering the rows in case of CSV's contents are covering a wider interval
jdf2[dateColName] = pd.to_datetime(jdf2[jdf2.columns[0]], format="%Y-%m-%d")
maskL = jdf2[dateColName] < interval[0]
maskR = jdf2[dateColName] > interval[1]
mask = maskL | maskR
jdf2.drop(jdf2[mask].index, inplace=True)

# Operation set 1: dropping duplicates, sorting and reindexing the table
jdf2.drop_duplicates(subset=dateColName, inplace=True)
jdf2.sort_values(dateColName, inplace=True)
jdf2.reset_index(drop=True, inplace=True)
val1 = set(jdf1["Date"].values)
val2 = set(jdf2["Date"].values)

# bigger:
val1 - val2

# empty:
val2 - val1
drop_duplicates() -> remove M rows, together ALL rows - M
boolean indexing with mask -> remove N rows, together ALL - M - N
boolean indexing with mask -> remove K rows, together ALL rows - K
drop_duplicates() -> remove L rows, together ALL - K - L
K != M
L != N