【问题标题】:How to set a value in a pandas DataFrame by mixed iloc and loc如何通过混合 iloc 和 loc 在 pandas DataFrame 中设置值
【发布时间】:2015-08-27 20:27:06
【问题描述】:

假设我想要一个函数来更改 DataFrame 的给定行号中命名列的值。
一种选择是找到列的位置并使用 iloc,如下所示:

def ChangeValue(df, rowNumber, fieldName, newValue):
    columnNumber = df.columns.get_loc(fieldName)
    df.iloc[rowNumber, columnNumber] = newValue

但我想知道是否有一种方法可以一次性使用 iloc 和 loc 的魔力,并且跳过手动转换。

有什么想法吗?

【问题讨论】:

  • 为什么需要 columnIndex? df.loc[rowIndex, fieldName] = newValue 不会工作吗?
  • 很抱歉给您带来了困惑。 “索引”这个词具有误导性,所以我改变了它。假设索引在这里不相关。
  • 事实仍然是你为什么需要这个,如果你的 df 索引值已经由 rowNumber 表示并且 fieldName 已经是一个列,那么我的第一条评论就可以了
  • 索引在这里无关紧要。示例:我想更改每个组的第一行中的一个字段。应用函数 f(在 df.groupby(...).apply(f) 中)可以使用 .iloc[0] 并且不知道索引(在这种情况下是分组字段)。
  • 我不认为你可以这样做,因为索引方法专门用于整数(iloc)或基于标签的(loc)索引,如果你开始混合两种样式,那么你必须转换整数标签做你想做的事

标签: python pandas


【解决方案1】:

我建议只使用iloc 结合Index.get_loc 方法。例如:

df.iloc[0:10, df.columns.get_loc('column_name')]

有点笨拙,但足够简单。

MultiIndex 具有 get_loc 和 get_locs 两者,它们需要一个序列;不幸的是,Index 似乎只有前者。

【讨论】:

    【解决方案2】:

    根据this answer,

    ix 通常会尝试表现得像 loc,但如果标签不在索引中,则会退回到表现得像 iloc。

    所以你应该特别能够使用df.ix[rowNumber, fieldname],以防type(df.index) != type(rowNumber)。

    【讨论】:

    • 请注意,ix 最近已被弃用,因此此解决方案将导致弃用警告。
    • ...真可惜,因为通常我知道我的数据框看起来如何...
    • @GustavLarsson 那么目前的解决方案是什么??
    • 现在看来您必须使用 df.loc[df.index[[0, 2]], 'A'] 才能获得相同的行为。阅读更多:pandas-docs.github.io/pandas-docs-travis/…
    【解决方案3】:

    即使它不适用于每种情况,如果您正在寻找顶部或底部条目,我想添加一个简单的:

        df.head(1)['column_name']  # first entry in 'column_name'
        df.tail(5)['column_name']  # last 5 entries in 'column_name'
    

    【讨论】:

    • 既不能概括也不能回答问题。
    【解决方案4】:

    使用loc

    人们不得不求助于要么一直使用integer location iloc——正如this answer所建议的那样——要么一直使用普通的location loc,如下所示:

    df.loc[df.index[[0, 7, 13]], 'column_name']
    

    【讨论】:

      【解决方案5】:

      编辑:执行以下操作不是一个好主意。我将答案作为反例。

      你可以这样做:

      df.iloc[rowNumber].loc[fieldName] = newValue
      

      例子

      import pandas as pd
      
      def ChangeValue(df, rowNumber, fieldName, newValue):
          df.iloc[rowNumber].loc[fieldName] = newValue
      
      df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]],
                        index=[4, 5, 6], columns=['A', 'B', 'C'])
      print(df)
          A   B   C
      4   0   2   3
      5   0   4   1
      6  10  20  30
      
      ChangeValue(df, 1, "B", 999)
      print(df)
          A    B   C
      4   0    2   3
      5   0  999   1
      6  10   20  30
      

      但是要小心,如果 newValue 不是同一个类型,它就不起作用并且会静默失败

      ChangeValue(df, 1, "B", "Oops")
      print(df)
          A    B   C
      4   0    2   3
      5   0  999   1
      6  10   20  30
      

      这里有一些关于使用列数据类型的好信息:Change column type in pandas

      【讨论】:

      猜你喜欢
      • 2018-02-08
      • 2019-05-26
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2015-10-12
      • 2015-04-29
      相关资源
      最近更新 更多