Python 基于其他列从行中减去值
很抱歉标题含糊不清,很难解释。它更容易显示 我试图减去同一行中的值,但基于其他列中的字符串。这是一个输入df:Python 基于其他列从行中减去值,python,pandas,loops,dataframe,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
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
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
我想根据时间的差异导出值。第一个时间差列将是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
您可以使用shift轻松找到像这样排序的df
的差异。但这其中有很多你不关心的差异。你想要第0、第4、第8。。。。第一个差和第二个、第六个、第十个差。。。第二种差异的差异。使用.iloc
import pandas as pd
diff = (df.Time-df.Time.shift(-1))
pd.DataFrame({'Diff_1': diff.iloc[::4].values,
'Diff_2': diff.iloc[2::4].values})
# Diff_1 Diff_2
#0 -20.0 29.0
#1 25.0 -48.0
输出:
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
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
刚刚完成。如果一个事件是ABC,下一个事件是否总是DEF?是的。总是按那个顺序。所以ABC,DEF,GHI,JKL。然后重复这个顺序。但这种情况发生的次数各不相同。上面的示例将此过程显示两次。我的数据集可能是5-12倍。