为什么 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_datatest_data 都没有被编辑,最终的 datatest_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_datatest_data 进行排序,则 inplace 选项就是您要查找的选项。