【问题标题】:Can't modify Pandas DataFrame while iterating迭代时无法修改 Pandas DataFrame
【发布时间】:2019-03-19 19:52:11
【问题描述】:

我的问题是关于下面的 FOR 循环,我看到 Kaggle 上的著名数据科学家正在使用它。但是它似乎对我不起作用。

Python 3.66。 熊猫 0.23.4

设置

train = pd.DataFrame({'id': [2, 3, 1], 'time':['2017-04-17 22:23:22', '2018-05-22 14:20:00', '2017-01-09 08:02:14']})
test = pd.DataFrame({'id': [2, 3, 1], 'time':['2017-04-17 22:23:22', '2018-05-22 14:20:00', '2017-01-09 08:02:14']})
train

>>>         id  time  
>>>   0     2   2017-04-17 22:23:22
>>>   1     3   2018-05-22 14:20:00
>>>   2     1   2017-01-09 08:02:14

排序(这可行)

train.sort_values('time', ascending=True)

>>>     id  time
>>> 2   1   2017-01-09 08:02:14
>>> 0   2   2017-04-17 22:23:22
>>> 1   3   2018-05-22 14:20:00

在 FOR 循环中对其进行排序 - 为什么这不起作用?

for data in [train, test]:
    data = data.sort_values('time', ascending=True)
train

>>>     id  time
>>> 0   2   2017-04-17 22:23:22
>>> 1   3   2018-05-22 14:20:00
>>> 2   1   2017-01-09 08:02:14

【问题讨论】:

    标签: python python-3.x pandas list for-loop


    【解决方案1】:

    在 FOR 循环中对其进行排序 - 为什么这不起作用?

    因为您的 for 循环不会将您新定义的变量 data 绑定到您的 [train, test] 中的对象。您在每个循环中重新定义data,而不更改traintest

    相反,您可以使用序列解包:

    train, test = (df.sort_values('time') for df in (train, test))
    

    或者,在for 循环中使用enumerate

    data = [train, test]
    for idx, df in enumerate(data):
        data[idx] = df.sort_values('time')
    

    然后通过索引引用您的数据帧,即data[0]data[1]

    或者,使用字典并迭代项目:

    data = {'train': train, 'test': test}
    
    for key, df in d.items():
        data[key] = df.sort_values('time')
    

    然后通过键引用您的数据帧,即data['train']data['test']

    【讨论】:

    • 好的,看来这仅适用于系列,但不适用于数据帧。例如。这有效:for data in [train, test]: data['time'] = 5
    • jpp,我尝试了您提出的 3 个解决方案。只有第一种方法实际上对 train 中的数据进行排序。其他 2 种方法没有。
    • @ihopethiswillfi,您必须了解如何使用第二种和第三种解决方案。此后将数据帧称为data[0] / data[1](在第一种情况下)或data['train'] / data['test'](在第二种情况下)。
    • 哦,是的,这是有道理的。谢谢。知道为什么更新 Series 有效,但更新 DataFrame 无效吗?或者我也可以创建一个新问题。
    • @ihopethiswillfi,抱歉,不知道您所说的“更新系列”是什么意思。
    【解决方案2】:

    有一个简单的方法,只需使用inplace=True参数进行排序

    >>> train = pd.DataFrame({'id': [2, 3, 1], 'time':['2017-04-17 22:23:22', '2018-05-22 14:20:00', '2017-01-09 08:02:14']})
    >>> test = pd.DataFrame({'id': [2, 3, 1], 'time':['2017-04-17 22:23:22', '2018-05-22 14:20:00', '2017-01-09 08:02:14']})
    >>> for data in [train, test]:
         data.sort_values('time', ascending=True, inplace=True)
    
    >>> test
       id                 time
    2   1  2017-01-09 08:02:14
    0   2  2017-04-17 22:23:22
    1   3  2018-05-22 14:20:00
    >>> train
       id                 time
    2   1  2017-01-09 08:02:14
    0   2  2017-04-17 22:23:22
    1   3  2018-05-22 14:20:00
    

    如果您希望索引再次更新,只需添加 reset_indext()

    data.sort_values('time', ascending=True, inplace=True)
    data.reset_index(inplace=True, drop=True)
    

    【讨论】:

    • 正确。不幸的是 inplace 将被弃用。资料来源:主要 Pandas 开发人员之一的最新视频。抱歉,我忘记了链接和他的名字。
    猜你喜欢
    • 2018-01-15
    • 2019-08-06
    • 2019-06-08
    • 2020-01-03
    • 2021-12-28
    • 2021-11-26
    • 1970-01-01
    • 2018-10-13
    • 2021-02-24
    相关资源
    最近更新 更多