python - 根据其他列从行中减去值

标签 python pandas loops dataframe

抱歉,标题含糊不清,很难解释。更容易显示。

我正在尝试减去同一行中的值,但基于其他列中的字符串。这是一个输入 df:

import pandas as pd
import numpy as np

k = 5
N = 8

d = ({'Time' : np.random.randint(k, k + 100 , size=N),
    'Events' : ['ABC','DEF','GHI','JKL','ABC','DEF','GHI','JKL'],
    'Number1' : ['xx','xx',1,'xx','xx','xx',2,'xx'],
    'Number2' : ['xx',1,'xx',1,'xx',2,'xx',2]})

df = pd.DataFrame(data=d)

输出:

  Events Number1 Number2  Time
0    ABC      xx      xx    14
1    DEF      xx       1    34
2    GHI       1      xx    78
3    JKL      xx       1    49
4    ABC      xx      xx    49
5    DEF      xx       2    24
6    GHI       2      xx    19
7    JKL      xx       2    67

我想根据时间的差异导出值。第一个时间差列将为 ABC - DEF,第二列将为 GHI - JKL

我需要多次重复这个过程。上面的示例显示了 2 次循环。我可以对 Number1Number2 列使用整数,但它们不按顺序排列。

我尝试组合并填充这些列以显示订单。然后使用此专栏作为引用。

for col in ['Number2']:
    df[col] = df[col].ffill() 

但是当我需要 4 个时,这会创建 5 个相同的整数。

然后,我通过行切片手动减去适当的值,但当我必须多次执行此操作时,它变得非常低效。

是否可以创建一个循环来减去预期的行?

对于上面的示例,输出将是:

   Diff_1  Diff_2
0     -20      29
1      25     -48

最佳答案

import pandas as pd
import numpy as np

k = 5
N = 8

d = ({'Time' : np.random.randint(k, k + 100 , size=N),
    'Events' : ['ABC','DEF','GHI','JKL','ABC','DEF','GHI','JKL'],
    'Number1' : ['xx','xx',1,'xx','xx','xx',2,'xx'],
    'Number2' : ['xx',1,'xx',1,'xx',2,'xx',2]})

df = pd.DataFrame(data=d)
print(df)

输出:

      Events Number1 Number2  Time
0    ABC      xx      xx     8
1    DEF      xx       1    54
2    GHI       1      xx    52
3    JKL      xx       1    101
4    ABC      xx      xx    56
5    DEF      xx       2    34
6    GHI       2      xx    81
7    JKL      xx       2    23

这将在 df 中包含新的列。我们只关心 ABCGHI 的行

df['diff'] = df['Time'] - df['Time'].shift(-1)
diff = pd.DataFrame({
    'diff1' : list(df.loc[df['Events'] == 'ABC', 'diff']),
    'diff2' : list(df.loc[df['Events'] == 'GHI', 'diff'])
})
print(diff)

输出:

   diff1  diff2
0  -46.0  -49.0
1   22.0   58.0

关于python - 根据其他列从行中减去值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50055065/

相关文章:

java - while(true) 循环中的 switch 语句,文本出现两次

C++ If 循环错误

python - 在 NumPy 数组中概括切片操作

python - 如何使用 opencv (python) 从 url 读取 gif

python - 为什么这些字符串不相等? (Python)

python - 如何检查前几个月列表中是否存在标识符

javascript - 如何使用循环在 Canvas 中的随机位置多次绘制它?

python - 在 python 的 csv 文件中添加新行以输出

python - 如何多次替换 Pandas Column 中的值?

pandas - matplotlib.axis.axes mplfinance 体积误差