抱歉,标题含糊不清,很难解释。更容易显示。
我正在尝试减去同一行中的值,但基于其他列中的字符串。这是一个输入 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 次循环。我可以对 Number1
和 Number2
列使用整数,但它们不按顺序排列。
我尝试组合并填充这些列以显示订单。然后使用此专栏作为引用。
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 中包含新的列。我们只关心 ABC
和 GHI
的行
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/