基于其他列从行中减去值

2024-04-26 03:24:03 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉,标题很模糊,很难解释。更容易展示。你知道吗

我试图减去同一行中的值,但基于其他列中的字符串。这是一个输入数据框:

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

我想基于Time中的差异导出值。第一个时间差列将是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

Tags: importdftimedefasnpcol整数
2条回答
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

您可以使用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

相关问题 更多 >