Python 比较两个连续行并基于特定逻辑操作创建新列

Python 比较两个连续行并基于特定逻辑操作创建新列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个有两列的数据框 df = ['xPos', 'lineNum'] import pandas as pd data = '''\ xPos lineNum 40 1 50 1 75 1 90 1 42 2 75 2 110 2 45 3 70 3 95 3 125 3 38 4 56 4 74 4''' 我已经使用 aggrDF=df

我有一个有两列的数据框

df = ['xPos', 'lineNum']   
import pandas as pd



data = '''\
   xPos lineNum
    40  1
    50  1
    75  1
    90  1
    42  2
    75  2
    110 2
    45  3
    70  3
    95  3
    125 3
    38  4
    56  4
    74  4'''
我已经使用

aggrDF=df.description(include='all')

命令

我对xPos的最小值感兴趣。所以,我通过使用

minxPos = aggrDF.ix['min']['xPos']  
所需输出

data = '''\
xPos lineNum xDiff
40  1   2
50  1   10
75  1   25
90  1   15
42  2   4
75  2   33
110 2   35
45  3   7
70  3   25
95  3   25
125 3   30
38  4   0
56  4   18
74  4   18'''
逻辑 我想对数据帧的两个连续行进行比较,并根据此逻辑计算一个新列:

 if( df['LineNum'] != df['LineNum'].shift(1) ):
    df['xDiff'] = df['xPos'] - minxPos
  else:
    df['xDiff'] = df['xPos'].shift(1)
基本上,我希望新列具有df中两个连续行的差异,只要行号相同

如果行号更改,那么xDiff列应该与聚合数据帧中的最小xPos值存在差异


你能帮忙吗?谢谢,

这两行应该可以:

df['xDiff'] = df.groupby('lineNum').diff()['xPos']

df.loc[df['xDiff'].isnull(), 'xDiff'] = df['xPos'] - minxPos

>>> df
    xPos  lineNum  xDiff
0     40        1    2.0
1     50        1   10.0
2     75        1   25.0
3     90        1   15.0
4     42        2    4.0
5     75        2   33.0
6    110        2   35.0
7     45        3    7.0
8     70        3   25.0
9     95        3   25.0
10   125        3   30.0
11    38        4    0.0
12    56        4   18.0
13    74        4   18.0

您只需要
groupby
lineNum和
apply
您已经写下的条件

df['xDiff']=np.concatenate(df.groupby('lineNum').apply(lambda x : np.where(x['lineNum'] != x['lineNum'].shift(1),x['xPos'] - x['xPos'].min(),x['xPos'].shift(1)).astype(int)).values)
df
Out[76]: 
    xPos  lineNum  xDiff
0     40        1      0
1     50        1     40
2     75        1     50
3     90        1     75
4     42        2      0
5     75        2     42
6    110        2     75
7     45        3      0
8     70        3     45
9     95        3     70
10   125        3     95
11    38        4      0
12    56        4     38
13    74        4     56

检查你的输出,这不是OP想要的(除非我遗漏了什么)@sacul这是我的理解…根据他的措辞,如果行号改变,那么,xDiff列应该与聚合数据帧中的最小xPos值存在差异。从它们所需的输出来看,我认为它们是指当行号为changes@sacul如果这是预期的结果,我想op已经做对了?甚至他的回答看起来也不整洁,但是考虑速度应该比Apple的速度快,我只是认为OP在寻找替代的非滑稽方式来获得他们的“期望输出”DF。有点不清楚…谢谢Sacul的及时回复。我很感激!。我一到办公室就会尝试这个方法,并在尝试解决方案后接受答案。当我厌倦了这个方法时,我得到了这个错误df['LWS']=df.groupby('LineNum').diff()#df.loc[df['LWS'].isnull(),'LWS']=df['x0']-df['x0'].min()错误是传递的项数错误19,placement意味着1您可能有未在原始帖子中显示的列。尝试使用
df.groupby('lineNum').diff()['xPos']