我有两列的数据框
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.describe(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值有所不同。
你能帮忙吗?谢谢,
最佳答案
您只需要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
关于python - 比较两个连续的行并基于特定的逻辑操作创建新的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49641907/