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']