如何通过混合iloc和loc在pandas DataFrame中设置值

Pau*_*ter 8 python pandas

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

def ChangeValue(df, rowNumber, fieldName, newValue):
    columnNumber = df.columns.get_loc(fieldName)
    df.iloc[rowNumber, columnNumber] = newValue
Run Code Online (Sandbox Code Playgroud)

但是我想知道是否有办法一次性使用iloc和loc的魔法,并跳过手动转换.

有任何想法吗?

Ser*_*ndt 8

使用loc

\n

人们必须求助于要么一直使用整数位置iloc\xe2\x80\x94 如本答案中建议的那样,\xe2\x80\x94 要么一直使用普通位置loc,如下所示:

\n
df.loc[df.index[[0, 7, 13]], \'column_name\']\n
Run Code Online (Sandbox Code Playgroud)\n


tra*_*avc 5

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

df.iloc[0:10, df.columns.get_loc('column_name')]
Run Code Online (Sandbox Code Playgroud)

有点笨拙,但足够简单。

MultiIndex同时具有get_locget_locs它接受一个序列; 不幸的Index是似乎只有前者。


Rob*_*lak 3

根据这个答案

ix通常会尝试表现得像标签不在索引中一样loc,但又会回到iloc像标签不在索引中一样的表现。

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

  • 看来现在你必须使用 `df.loc[df.index[[0, 2]], 'A']` 才能获得相同的行为。阅读更多:https://pandas-docs.github.io/pandas-docs-travis/indexing.html#ix-indexer-is-deprecated (5认同)
  • 请注意,“ix”最近已被弃用,因此此解决方案将导致弃用警告。 (4认同)