【问题标题】:Pandas/Python: Replace multiple values in multiple columnsPandas/Python:替换多列中的多个值
【发布时间】:2016-03-29 08:04:05
【问题描述】:

所有,我有一个 190 列和 902 行的分析 csv 文件。我需要重新编码几列(准确地说是 18 个)中的值,从当前的 1-5 Likert 缩放到 0-4 Likert 缩放。

我尝试过使用替换:

df.replace({'Job_Performance1': {1:0, 2:1, 3:2, 4:3, 5:4}}, inplace=True)

但这会引发值错误:“不允许使用重叠的键和值进行替换”

我可以使用地图:

df['job_perf1'] = df.Job_Performance1.map({1:0, 2:1, 3:2, 4:3, 5:4})

但是,我知道必须有一种更有效的方法来实现这一点,因为这个用例是统计分析和统计软件中的标准,例如SPSS

我在 StackOverFlow 上查看了多个问题,但没有一个完全适合我的用例。 例如Pandas - replacing column valuespandas replace multiple values one columnPython pandas: replace values multiple columns matching multiple columns from another dataframe

建议?

【问题讨论】:

  • 从列中减去1 有什么问题?
  • 我觉得这个问题没有得到正确的回答。如果您不能只使用-1,例如因为您想要替换{1:0, 2:1, 4:3},该怎么办?

标签: python pandas recode


【解决方案1】:

不需要映射。这可以作为向量加法来完成,因为实际上,您正在做的是从每个值中减去 1。这很优雅:

df['job_perf1'] = df['Job_Performance1'] - numpy.ones(len(df['Job_Performance1']))

或者,没有numpy

df['job_perf1'] = df['Job_Performance1'] - [1] * len(df['Job_Performance1'])

【讨论】:

  • 你不需要这样做,只要这样做df['job_perf1'] = df['job_perf1'] -1
  • @EdChum aaaah,这是有道理的,感谢您指出这一点。 :) 现在我只需要弄清楚如何遍历我的 18 列。谢谢!
  • 你的整个 df 是 18 cols 吗?如果是这样,那么df = df -1 将全部完成,否则,组成一个感兴趣的列的列表,然后执行for col in col_list: df[col] = df[col] - 1
  • @EdChum 我真的需要更频繁地查看文档。无论如何,对于它的价值,pandas 在引擎盖下将标量转换为适当大小的数组,参见。 pandas source.
  • @EdChum 整个数据框有 190 多列,因此无法对整个数据框进行操作。此外,该代码比我想象的要简单得多,是因为我们正在执行列操作而不是基于行或单元格的操作吗? (obvi 对 Python/Pandas 来说还是很新的)
【解决方案2】:

您可以简单地从列中减去一个标量值,这实际上是您在此处所做的:

df['job_perf1'] = df['job_perf1'] - 1

此外,由于您需要在 18 个列上执行此操作,那么我将构建一个包含 18 个列名的列表,然后一次从所有列中减去 1

df[col_list] = df[col_list] - 1

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多