【问题标题】:Set value for particular cell in pandas DataFrame with iloc使用 iloc 为 pandas DataFrame 中的特定单元格设置值
【发布时间】:2015-10-12 16:44:26
【问题描述】:

我有一个类似于thisthis 的问题。不同的是我必须逐行选择,因为我不知道索引。

我想做df.iloc[0, 'COL_NAME'] = x 之类的事情,但 iloc 不允许这种访问。如果我这样做df.iloc[0]['COL_NAME'] = x,则会出现有关链式索引的警告。

【问题讨论】:

  • 你用的是什么版本的python和pandas?我在使用 pandas 0.16.1 的 PY3.4.2 上没有收到“链式索引”警告。您如何构建数据框有什么特别之处吗?

标签: python pandas


【解决方案1】:

对于混合位置和索引,使用.ix。但是你需要确保你的索引不是整数,否则会造成混乱。

df.ix[0, 'COL_NAME'] = x

更新:

或者,试试

df.iloc[0, df.columns.get_loc('COL_NAME')] = x

例子:

import pandas as pd
import numpy as np

# your data
# ========================
np.random.seed(0)
df = pd.DataFrame(np.random.randn(10, 2), columns=['col1', 'col2'], index=np.random.randint(1,100,10)).sort_index()

print(df)


      col1    col2
10  1.7641  0.4002
24  0.1440  1.4543
29  0.3131 -0.8541
32  0.9501 -0.1514
33  1.8676 -0.9773
36  0.7610  0.1217
56  1.4941 -0.2052
58  0.9787  2.2409
75 -0.1032  0.4106
76  0.4439  0.3337

# .iloc with get_loc
# ===================================
df.iloc[0, df.columns.get_loc('col2')] = 100

df

      col1      col2
10  1.7641  100.0000
24  0.1440    1.4543
29  0.3131   -0.8541
32  0.9501   -0.1514
33  1.8676   -0.9773
36  0.7610    0.1217
56  1.4941   -0.2052
58  0.9787    2.2409
75 -0.1032    0.4106
76  0.4439    0.3337

【讨论】:

  • 我的索引是一些选择的结果,它由不相关的整数组成:例如,[3,24, 34] ix[0] 会抛出错误。
  • @luna1999 那么不妨先试试reset_index,这样你就可以使用df.loc[0, 'COL_NAME']了,不会造成混淆。
  • @luna1999 我已经使用df.columns.get_loc 更新了我的代码,它应该适合你。如果不是这种情况,请告诉我。
  • @luna1999 不客气。很高兴它有帮助。 :-)
  • @JianxunLi 感谢.iloc 的提示。但是,我对一件事感到困惑(如果我错了,请纠正我):如果df.iloc[4:7] = x 返回一个副本df,其值[4:7] 设置为x,为什么df.iloc[4:7,df.columns.get_loc("C")] = x 设置为x原来的df?
【解决方案2】:

我要在这里添加的一件事是,数据帧上的 at 函数要快得多,尤其是在您对单个(而不是切片)值进行大量分配时。

df.at[index, 'col_name'] = x

根据我的经验,我获得了 20 倍的加速。 Here 是一篇用西班牙语写的文章,但仍然给人一种正在发生的事情的印象。

【讨论】:

    【解决方案3】:

    如果您知道位置,为什么不直接从中获取索引?

    然后使用.loc:

    df.loc[index, 'COL_NAME'] = x
    

    【讨论】:

    • df.loc 用于基于标签的索引,而不用于基于位置的索引。你可能指的是做类似df.loc[df.index[0], 'COL_NAME'] = x
    • 举个例子就好了。你可以复制gist.githubusercontent.com/MartinThoma/…
    【解决方案4】:

    你可以使用:

    df.set_value('Row_index', 'Column_name', value)
    

    set_value.ix 方法快约 100 倍。最好还是使用df['Row_index']['Column_name'] = value

    但由于set_value 现在是deprecated,所以.iat/.at 是很好的替代品。

    例如,如果我们有这个 data_frame

       A   B   C
    0  1   8   4 
    1  3   9   6
    2  22 33  52
    

    如果我们想修改单元格 [0,"A"] 的值我们可以这样做

    df.iat[0,0] = 2
    

    df.at[0,'A'] = 2

    【讨论】:

    • AttributeError: 'DataFrame' 对象没有属性 'set_value'
    • set_value() 已弃用
    • 我提到 set_value 已被弃用,在决定盲目投票之前请仔细阅读答案
    • 请!,编辑并说 set_value() 在一开始就被弃用了——在进一步阅读之前,我和其他人一样尝试过。这个答案是我找到的最好的答案,但这种困惑让人怀念它。谢谢。
    • 这一行已经被 seiad => 但是由于 set_value 现在已被弃用,所以 .iat/.at 是很好的替代品。
    【解决方案5】:

    另一种方法是,根据行的索引位置为给定行分配列值,索引位置始终从零开始,最后一个索引位置是数据帧的长度:

    df["COL_NAME"].iloc[0]=x
    

    【讨论】:

    • 也许添加一个简短的讨论,说明这与其他 4 个答案有何不同以及代码在做什么
    • 对于现代版本的 pandas,当您尝试此操作时会收到 SettingWithCopyWarning(请参阅 pandas.pydata.org/pandas-docs/stable/user_guide/…
    【解决方案6】:

    修改“r”行(“A”列)和“C”列交叉处的单元格中的值

    1. 检索列“A”中行“r”的索引

          i = df[ df['A']=='r' ].index.values[0]
      
    2. 修改所需列“C”中的值

          df.loc[i,"C"]="newValue"
      

    注意:在此之前,请务必重置行的索引...以拥有一个漂亮的索引列表!

            df=df.reset_index(drop=True)
    

    【讨论】:

      【解决方案7】:

      另一种方法是获取行索引,然后使用 df.loc 或 df.at。

      # get row index 'label' from row number 'irow'
      label = df.index.values[irow] 
      df.at[label, 'COL_NAME'] = x
      

      【讨论】:

      • 当您想将多行设置为相同的值时,这是最好的解决方案
      【解决方案8】:

      扩展建勋的答案,在熊猫中使用set_value mehtod。它为给定索引处的列设置值。

      来自熊猫文档:

      DataFrame.set_value(index, col, value)

      要在特定索引处为列设置值,请执行以下操作:

      df.set_value(index, 'COL_NAME', x)
      

      希望对你有帮助。

      【讨论】:

      • set_value 已折旧。对我们来说更好
      猜你喜欢
      • 2012-11-30
      • 2018-05-06
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2020-06-25
      • 2017-08-12
      相关资源
      最近更新 更多