【问题标题】:Python Pandas Adding or Subtracting User Defined Numbers to DataFramePython Pandas 向 DataFrame 添加或减去用户定义的数字
【发布时间】:2021-10-27 05:56:52
【问题描述】:

我正在尝试修改我从 Excel 中读取的数据框。我想修改“Region1”和“Region2”列,更具体地说,我想从“Region1”列中减去一个用户定义的数字,并将一个用户定义的数字添加到“Region2”。我可以修改数据框以便我可以同时执行这两个操作,即从“Region1”中减去 5 并将 5 添加到“Region2”。

import pandas as pd
import numpy as np

df = pd.read_csv('C:\\Users\\blahblah\\Desktop\\testroi.bed', delimiter= '\t')

df[['Region1', 'Region2']]

Region1 Region2
0   25870184    25870282
1   25880407    25880560
2   25881345    25881468
3   25883638    25883763
4   25889129    25889212
... ... ...
432 107645314   107645443
433 107646702   107646854
434 107651377   107651481
435 107651648   107651661
436 107665889   107665965
437 rows × 2 columns

我可以为“Region1”和“Region2”创建新的 dfs 来进行加/减,但我想知道是否可以在同一数据帧上使用 1 行代码同时执行这两个操作。所以基本上使用上面的数据框,'Region1'的第0个索引将是25870184 - 5 = 25870179和'Region2'的25870282 + 5 = 25870287。从所有列和行重复操作,即我知道我可以通过df=df['Region1'] -5 进行操作,但我想知道我是否可以同时进行两个操作,即df = df['Region1'] -5 , df['Region2'] + 5。我遇到的麻烦是在同一个数据帧上同时进行两个操作。

谢谢

【问题讨论】:

  • 您想同时做这两件事有什么特别的原因吗?
  • 如果我为加减运算创建单独的 DF,我觉得我必须跟踪多个 DF 并在以后合并它们,这可能更难维护,尤其是对于大数据集。所以我想避免复杂性。

标签: python pandas dataframe addition subtraction


【解决方案1】:

您可以使用apply 同时修改所有值。

df = pd.DataFrame([[0, 0], [1, 1], [2, 2]], columns=["Region1", "Region2"])

   Region1  Region2
0        0        0
1        1        1
2        2        2

number1, number2 = 1, 2 # User defined numbers

def adjust(row):
    row["Region1"] -= number1
    row["Region2"] += number2
    return row

df.apply(adjust, axis=1)

输出

   Region1  Region2
0       -1        2
1        0        3
2        1        4

但是,我认为与简单地执行 2 个单独的操作相比没有任何优势:

df["Region1"] -= number1
df["Region2"] += number2
df

输出:

   Region1  Region2
0       -1        2
1        0        3
2        1        4

【讨论】:

    【解决方案2】:

    可以使用.assign()语句,如下:

    df = df.assign(Region1=(df['Region1'] - 5), Region2=(df['Region2'] + 5))
    

    结果:

    print(df)
    
           Region1    Region2
    0     25870179   25870287
    1     25880402   25880565
    2     25881340   25881473
    3     25883633   25883768
    4     25889124   25889217
    432  107645309  107645448
    433  107646697  107646859
    434  107651372  107651486
    435  107651643  107651666
    436  107665884  107665970
    

    【讨论】:

    • 大家好,感谢您提供的快速而精彩的建议。我尝试了它们,它们都起作用了。我是一个快乐的露营者。 :)
    • @MuffinManCaniko 很高兴能帮上忙,你得到了你想要的。请记住接受您认为最适合您的情况的答案。我认为您在此处引用的示例案例只是简化问题的虚构案例。选择最适合您的一般用途的解决方案。您可以点击左侧的✓ 接受答案(见How to accept SO answers) 祝您编程愉快,祝您有美好的一天! :-)
    • @MuffinManCaniko 查看 StackOverflow 指南here
    • @是的,谢谢,我尝试为答案投票,但我没有足够的分数。我是农民。
    • @MuffinManCaniko 不管你有多少分,你仍然可以接受答案。接受不赞成。我已经给你提供了指导方针How to accept SO answers)
    【解决方案3】:

    最简单(也是最快的,因为它是就地)是:

    df[['Region1', 'Region2']] += [-5, 5]
    
    >>> df[['Region1', 'Region2']]
           Region1    Region2
    0     25870179   25870287
    1     25880402   25880565
    2     25881340   25881473
    3     25883633   25883768
    4     25889124   25889217
    432  107645309  107645448
    433  107646697  107646859
    434  107651372  107651486
    435  107651643  107651666
    436  107665884  107665970
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 2020-05-02
      • 2023-02-02
      • 2020-07-20
      • 1970-01-01
      相关资源
      最近更新 更多