我有两列的数据框

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/

10-12 23:16