python - 用字典值覆盖 pandas DataFrame 列,其中字典键与非索引列匹配?

标签 python pandas

我有一个DataFrame df 和 dict d,像这样:

>>> df
   a   b
0  5  10
1  6  11
2  7  12
3  8  13
4  9  14
>>> d = {6: 22, 8: 26}

对于每个(key, val)在字典中,我想找到列 a 所在的行匹配该键,并覆盖其 b包含值的列。例如,在本例中,b 的值第 1 行中的值将更改为 22,第 3 行中的值将更改为 26。

我该怎么做?

最佳答案

假设可以将新值传播到列 a 匹配的所有行(如果列 a 中有重复项) >) 然后:

for a_val, b_val in d.iteritems():
    df['b'][df.a==a_val] = b_val

或者避免链接赋值操作:

for a_val, b_val in d.iteritems():
    df.loc[df.a==a_val, 'b'] = b_val

请注意,要使用 loc,您必须使用 Pandas 0.11 或更高版本。对于旧版本,您可以使用 .ix 来防止链式分配。

@Jeff 指向this link其中讨论了一个现象:I had already mentioned in this comment 。请注意,这不是正确性问题,因为反转访问顺序具有可预测的效果。你可以很容易地看到这一点,例如如下:

In [102]: id(df[df.a==5]['b'])
Out[102]: 113795992

In [103]: id(df['b'][df.a==5])
Out[103]: 113725760

如果您先获取该列,然后根据该列的索引进行分配,则更改会影响该列。由于该列是 DataFrame 的一部分,因此更改会影响 DataFrame。如果您首先对一组行建立索引,那么您现在不再谈论相同的 DataFrame,因此从过滤对象中获取列不会为您提供原始列的 View 。

@Jeff 认为这使得它“不正确”,而我认为这是明显且预期的行为。在特殊情况下,当您有混合数据类型列并且正在进行某种类型升级/降级时,会阻止 Pandas 将值写入该列,那么您可能会遇到正确性问题。但考虑到 loc 直到 Pandas 0.11 才可用,我认为指出如何使用链式赋值来做这件事仍然是公平的,而不是假装 loc 是唯一的事情这可能是正确的选择。

如果有人可以提供更明确的理由来认为它是“不正确的”(而不是只是在风格上不喜欢这种方式),请贡献出来,我将尝试对各种陷阱进行更全面的撰写。

关于python - 用字典值覆盖 pandas DataFrame 列,其中字典键与非索引列匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19125680/

相关文章:

python - 我正在尝试编写一个简短的程序来找到理想的多米诺骨牌链,有什么想法吗?

python - 将 JSON 导入 pandas 数据框错误

python - 如何使用 Python 和 SMTP 发送格式正确的电子邮件?

python - 对部分列值 pandas python 进行分组和输出

python - 如何使用 python 连接多个 .wav 文件

python - Pandas 在数据框列上滑动窗口

python - Pandas 设置多级列索引

python - 使用自定义属性保存/加载 Pandas 数据框

python - 更改 tkinter 中按钮的颜色适用于 Windows,但不适用于 Mac OSX

python - Django获取PointField的坐标值