比较两个连续的行并根据特定的逻辑操作创建一个新列

时间:2018-04-04 02:41:13

标签: 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.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值有所不同。

你能帮帮忙吗?感谢,

2 个答案:

答案 0 :(得分:2)

这两行应该这样做:

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

答案 1 :(得分:1)

您只需要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