Python Pandas 向 DataFrame 添加或减去用户定义的数字
Python Pandas Adding or Subtracting User Defined Numbers to DataFrame
我正在尝试修改从 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 来做 adding/subtracting,但我想知道我是否可以用 1 行代码同时执行这两个操作在同一个数据帧上。所以基本上使用上面的数据框,'Region1' 的第 0 个索引将是 25870184 - 5 = 25870179 和 'Region2' 的 25870282 + 5 = 25870287。从所有列和行重复操作,即我知道我可以通过 df=df['Region1'] -5
进行操作,但我想知道我是否可以同时进行两个操作,即 df = df['Region1'] -5 , df['Region2'] + 5
。我遇到的问题是在同一个数据帧上同时进行两个操作。
谢谢
您可以使用 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
可以利用.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
最简单的(也是最快的,因为它是 inplace)是:
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
我正在尝试修改从 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 来做 adding/subtracting,但我想知道我是否可以用 1 行代码同时执行这两个操作在同一个数据帧上。所以基本上使用上面的数据框,'Region1' 的第 0 个索引将是 25870184 - 5 = 25870179 和 'Region2' 的 25870282 + 5 = 25870287。从所有列和行重复操作,即我知道我可以通过 df=df['Region1'] -5
进行操作,但我想知道我是否可以同时进行两个操作,即 df = df['Region1'] -5 , df['Region2'] + 5
。我遇到的问题是在同一个数据帧上同时进行两个操作。
谢谢
您可以使用 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
可以利用.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
最简单的(也是最快的,因为它是 inplace)是:
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