为什么 pd.DataFrame.sort_values() 的赋值在循环内不起作用?
Why does assignment of pd.DataFrame.sort_values() not work inside loop?
import numpy as np
import pandas as pd
test_data = pd.DataFrame(
dict(
value=np.random.rand(9) - 0.5,
group=np.repeat(np.arange(3), 3),
time_idx=np.tile(np.arange(3), 3),
)
)
test_data
train_data = pd.DataFrame(
dict(
value=np.random.rand(9) - 0.5,
group=np.repeat(np.arange(3), 3),
time_idx=np.tile(np.arange(3), 3),
)
)
train_data
为什么要这样分配:
for data in [train_data, test_data]:
data = data.sort_values('value')
不让 train_data 或 test_data 排序?
在循环外进行赋值工作得很好。像这样:
train_data = train_data.sort_values('value')
在 for 循环中执行就地操作也可以:
for data in [train_data, test_data]:
data.sort_values('value', inplace=True)
当你这样做时:
for data in [train_data, test_data]:
data = data.sort_values('value')
您先取 train_data
,对其进行排序并将其作为副本分配给 data
。稍后与 test_data
相同。然后,train_data
或 test_data
都没有被编辑,最终的 data
是 test_data
的排序版本,因为 for-loop 重新分配了对象。
喜欢如果你这样做:
data = train_data
data.sort_values('value',inplace=True)
data = test_data
data.sort_values('value',inplace=True)
当你这样做时:
for data in [train_data, test_data]:
data.sort_values('value', inplace=True)
inplace=True
正在编辑对象 data
,它首先也是对 train_data
的引用,其次是对 test_data
的引用。所以他们也被编辑了。而数据也是test_data
.
就像你一样:
train_data.sort_values('value',inplace=True)
data = train_data
test_data.sort_values('value',inplace=True)
data = test_data
for-loop 中的赋值 data =
完美运行。如果您真的想对 train_data
和 test_data
进行排序,则 inplace 选项就是您要查找的选项。
import numpy as np
import pandas as pd
test_data = pd.DataFrame(
dict(
value=np.random.rand(9) - 0.5,
group=np.repeat(np.arange(3), 3),
time_idx=np.tile(np.arange(3), 3),
)
)
test_data
train_data = pd.DataFrame(
dict(
value=np.random.rand(9) - 0.5,
group=np.repeat(np.arange(3), 3),
time_idx=np.tile(np.arange(3), 3),
)
)
train_data
为什么要这样分配:
for data in [train_data, test_data]:
data = data.sort_values('value')
不让 train_data 或 test_data 排序?
在循环外进行赋值工作得很好。像这样:
train_data = train_data.sort_values('value')
在 for 循环中执行就地操作也可以:
for data in [train_data, test_data]:
data.sort_values('value', inplace=True)
当你这样做时:
for data in [train_data, test_data]:
data = data.sort_values('value')
您先取 train_data
,对其进行排序并将其作为副本分配给 data
。稍后与 test_data
相同。然后,train_data
或 test_data
都没有被编辑,最终的 data
是 test_data
的排序版本,因为 for-loop 重新分配了对象。
喜欢如果你这样做:
data = train_data
data.sort_values('value',inplace=True)
data = test_data
data.sort_values('value',inplace=True)
当你这样做时:
for data in [train_data, test_data]:
data.sort_values('value', inplace=True)
inplace=True
正在编辑对象 data
,它首先也是对 train_data
的引用,其次是对 test_data
的引用。所以他们也被编辑了。而数据也是test_data
.
就像你一样:
train_data.sort_values('value',inplace=True)
data = train_data
test_data.sort_values('value',inplace=True)
data = test_data
for-loop 中的赋值 data =
完美运行。如果您真的想对 train_data
和 test_data
进行排序,则 inplace 选项就是您要查找的选项。