【问题标题】:Modify pandas dataframe within iterrows loop在 iterrows 循环中修改 pandas 数据框
【发布时间】:2020-08-25 00:26:36
【问题描述】:

我是 Python 新手。

我正在尝试使用 for 循环向数据框中的元素添加前缀(序列号),以在分析前进行数据清理/准备。

代码是

a=pd.read_excel('C:/Users/HP/Desktop/WFH/PowerBI/CMM data.xlsx','CMM_unclean')
a['Serial Number'] = a['Serial Number'].apply(str)
print(a.iloc[72,1])

for index,row in a.iterrows():
    if len(row['Serial Number']) == 6:
        row['Serial Number'] = 'SR0' + row['Serial Number']
        print(row['Serial Number'])

print(a.iloc[72,1])

输出是

C:\Users\HP\anaconda3\envs\test\python.exe C:/Users/HP/PycharmProjects/test/first.py
101306
SR0101306
101306

我不明白为什么在 for 循环内部会发生这种情况,值在变化,但在外部是一样的。

【问题讨论】:

    标签: python pandas for-loop


    【解决方案1】:

    这永远不会改变名为 a 的实际数据框。

    TL;DR:您从 iterrows 返回的行是不再连接到原始数据框的副本,因此编辑不会更改您的数据框。但是,您可以使用索引来访问和编辑数据框的相关行。


    解释

    为什么?

    您从iterrows 返回的行是副本没有 更长 连接到原始数据框,因此编辑不会更改您的数据框。但是,您可以使用index 访问和编辑数据框的相关行。


    解决办法是这样的:

    import pandas as pd
    
    a = pd.read_excel("Book1.xlsx")
    a['Serial Number'] = a['Serial Number'].apply(str)
    
    a.head()
    #    ID    Serial Number
    # 0   1     SR0101306
    # 1   2       1101306
    
    print(a.iloc[0,1])
    #101306
    
    for index,row in a.iterrows():
        row = row.copy()
        if len(row['Serial Number']) == 6:
            # use the index and .loc method to alter the dataframe
            a.loc[index, 'Serial Number'] = 'SR0' + row['Serial Number']
    
    print(a.iloc[0,1])
    #SR0101306
    

    【讨论】:

    • 非常感谢。很好的解释
    • 很高兴我能提供帮助。如果有帮助,请考虑支持我的回答
    【解决方案2】:

    In the documentation,我读到了(从那里强调)

    你应该永远不要修改你正在迭代的东西。这不能保证在所有情况下都有效。根据数据类型,迭代器返回一个副本而不是一个视图,写入它不会有任何效果。

    在您的情况下,这可能意味着制作了一个副本并且没有使用参考。因此,更改暂时适用于副本,但不适用于数据框中的数据。

    【讨论】:

    • 感谢 Wolf 先生,这非常有用
    【解决方案3】:

    由于您已经在使用apply,您可以直接在调用apply 的函数中执行此操作:

    def fix_serial(n):
        n_s = str(n)
    
        if len(n_s) == 6:
            n_s = 'SR' + n_s
    
        return n_s
    
    a['Serial Number'] = a['Serial Number'].apply(fix_serial)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 2017-09-07
      相关资源
      最近更新 更多