Pandas различение строк в одной группе против строк предыдущей группы - PullRequest
1 голос
/ 05 февраля 2020

Как определить разницу между строками в col X, но между группами, а не внутри групп. Таким образом, значение diff в группах должно быть ffill.

df = pd.DataFrame({   
        'Time' : [1,1,2,2,3,3],                              
        'X' : [1,1,3,3,6,6],
        'Y' : [1,1,1,1,2,2],
    })

df['X'] = df['X'].diff()

df['X'] = df.groupby('Time')['X'].diff()

Предполагаемый результат:

   Time  X  Y
0     1  0  1
1     1  0  1
2     2  2  1
3     2  2  1
4     3  3  2
5     3  3  2

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Если значения внутри группы равны (но количество строк в группе не равно), вы можете сделать это, вычтя все строки в группе со значением предыдущей группы.

df['X'] - df['Time'].map(df.groupby('Time')['X'].max().shift()).fillna(df['X'])

0    0.0
1    0.0
2    2.0
3    2.0
4    3.0
5    3.0
dtype: float64

Подробности
Первый шаг - найти уникальные значения в каждой группе (я использую max(), но вы также можете использовать unique() или first()):

df.groupby('Time')['X'].max()

Time
1    1
2    3
3    6
Name: X, dtype: int64

Затем сдвиньте их вниз:

_.shift()

Time
1    NaN
2    1.0
3    3.0
Name: X, dtype: float64

Отобразите его обратно в «Время» (группировщик):

df['Time'].map(_)

0    NaN
1    NaN
2    1.0
3    1.0
4    3.0
5    3.0
Name: Time, dtype: float64

Заполните первую группу NaN «Х»:

_.fillna(df['X'])

0    1.0
1    1.0
2    1.0
3    1.0
4    3.0
5    3.0
Name: Time, dtype: float64

Теперь у вас есть RHS. Просто вычтите это из «Х» и все готово.

0 голосов
/ 05 февраля 2020

Если у вас есть фиксированные строки для каждой группы, вы можете сделать

>>> df.X = df.X.diff(periods=2).fillna(0)    # assumes all groups have two rows
>>> df
   Time    X  Y
0     1  0.0  1
1     1  0.0  1
2     2  2.0  1
3     2  2.0  1
4     3  3.0  2
5     3  3.0  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...