gpt4 book ai didi

python - 为什么两组操作之间没有顺序不变性?

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:32 25 4
gpt4 key购买 nike

我正在处理 CSV 文件/pandas 数据框,其中第一列包含日期。我想在这里进行一些到日期时间的转换、一些过滤、排序和重新索引。

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

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

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

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

jdf1 = x.copy(deep=True)
jdf2 = x.copy(deep=True)
interval = [DATE_START, DATE_END]
dateColName = "Date"

配置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)

对比

配置2:

# 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

如果交换此操作,结果应该不同,因为两者都删除行。调用它们的顺序很重要,因为有些行仅删除 drop_duplicates,有些行仅删除 bool 索引。

我认为这两种方法都对,就看什么需要了。

关于python - 为什么两组操作之间没有顺序不变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47050885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com