逐行迭代时更新熊猫中的数据框

2025-02-28 08:24:00
admin
原创
76
摘要:问题描述:我有一个看起来像这样的熊猫数据框(它非常大) date exer exp ifor mat 1092 2014-03-17 American M 528.205 2014-04-19 1093 2014-03-17 Amer...

问题描述:

我有一个看起来像这样的熊猫数据框(它非常大)

           date      exer exp     ifor         mat  
1092  2014-03-17  American   M  528.205  2014-04-19 
1093  2014-03-17  American   M  528.205  2014-04-19 
1094  2014-03-17  American   M  528.205  2014-04-19 
1095  2014-03-17  American   M  528.205  2014-04-19    
1096  2014-03-17  American   M  528.205  2014-05-17 

现在我想逐行迭代,当我遍历每一行时,ifor
每行的值可能会根据某些条件而改变,我需要查找另一个数据框。

现在,我该如何在迭代过程中更新它。尝试了一些方法,但都不起作用。

for i, row in df.iterrows():
    if <something>:
        row['ifor'] = x
    else:
        row['ifor'] = y

    df.ix[i]['ifor'] = x

这些方法似乎都不起作用。我没有看到数据框中更新的值。


解决方案 1:

您可以使用df.at

for i, row in df.iterrows():
    ifor_val = something
    if <condition>:
        ifor_val = something_else
    df.at[i,'ifor'] = ifor_val

对于 0.21.0 之前的版本,使用df.set_value

for i, row in df.iterrows():
    ifor_val = something
    if <condition>:
        ifor_val = something_else
    df.set_value(i,'ifor',ifor_val)

如果您不需要行值,您可以简单地迭代索引df,但我保留了原始的 for 循环,以防您需要这里未显示的行值。

解决方案 2:

Pandas DataFrame 对象应被视为一系列系列。换句话说,您应该从列的角度来考虑它。这很重要,因为当您使用时,pd.DataFrame.iterrows您会将行作为系列进行迭代。但这些不是数据框存储的系列,因此它们是迭代时为您创建的新系列。这意味着当您尝试分配给它们时,这些编辑不会反映在原始数据框中。

好的,现在这个问题已经解决了:我们该做什么?

本文之前的建议包括:

  1. pd.DataFrame.set_value从 Pandas 0.21 版开始已弃用

  2. pd.DataFrame.ix已弃用

  3. pd.DataFrame.loc很好,但可以在数组索引器上工作,你可以做得更好

我的建议

使用pd.DataFrame.at

for i in df.index:
    if <something>:
        df.at[i, 'ifor'] = x
    else:
        df.at[i, 'ifor'] = y

您甚至可以将其更改为:

for i in df.index:
    df.at[i, 'ifor'] = x if <something> else y

回复评论

如果我需要将前一行的值用于 if 条件,该怎么办?

for i in range(1, len(df) + 1):
    j = df.columns.get_loc('ifor')
    if <something>:
        df.iat[i - 1, j] = x
    else:
        df.iat[i - 1, j] = y

解决方案 3:

您可以使用的方法是itertuples(),它以命名元组的形式迭代 DataFrame 行,索引值作为元组的第一个元素。与相比,它要快得多iterrows()。对于itertuples(),每个都row包含Index在 DataFrame 中,您可以使用loc来设置值。

for row in df.itertuples():
    if <something>:
        df.at[row.Index, 'ifor'] = x
    else:
        df.at[row.Index, 'ifor'] = x

    df.loc[row.Index, 'ifor'] = x

大多数情况下,itertuples()iat或更快at

感谢@SantiStSupery,使用.at比快得多loc

解决方案 4:

最好使用lambda以下函数df.apply()-

df["ifor"] = df.apply(lambda x: {value} if {condition} else x["ifor"], axis=1)

解决方案 5:

您应该通过df.ix[i, 'exp']=Xdf.loc[i, 'exp']=X而不是 来分配值df.ix[i]['ifor'] = x

否则,您正在处理一个视图,并且应该得到一个预热:

`-c:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead`

但可以肯定的是,循环最好被一些矢量化算法所取代,以充分利用DataFrame@Phillip Cloud 所建议的功能。

解决方案 6:

好吧,如果你无论如何都要进行迭代,为什么不使用最简单的方法呢?df['Column'].values[i]

df['Column'] = ''

for i in range(len(df)):
    df['Column'].values[i] = something/update/new_value

或者,如果您想将新值与旧值或类似内容进行比较,为什么不将其存储在列表中然后附加在最后。

mylist, df['Column'] = [], ''

for <condition>:
    mylist.append(something/update/new_value)

df['Column'] = mylist

解决方案 7:

for i, row in df.iterrows():
    if <something>:
        df.at[i, 'ifor'] = x
    else:
        df.at[i, 'ifor'] = y

解决方案 8:

列表理解可能是一种选择。

df['new_column'] = [your_func(x) for x in df['column']]

这将遍历列 df['column'],使用 df['column'] 中的值调用函数 your_func,并为新列 df['new_column'] 中的行分配一个值。

请不要忘记创建一个函数。

解决方案 9:

从列中增加 MAX 数字。例如:

df1 = [sort_ID, Column1,Column2]
print(df1)

我的输出:

Sort_ID Column1 Column2
12         a    e
45         b    f
65         c    g
78         d    h

MAX = df1['Sort_ID'].max() #This returns my Max Number 

现在,我需要在 df2 中创建一个列并填充增加 MAX 的列值。

Sort_ID Column1 Column2
79      a1       e1
80      b1       f1
81      c1       g1
82      d1       h1

注意:df2 最初只包含 Column1 和 Column2。我们需要创建 Sortid 列并从 df1 中增加 MAX。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用