Как сдвинуть значения столбцов, основываясь на разнице с предыдущей строкой в ​​python pandas? - PullRequest
1 голос
/ 08 мая 2019

У меня есть датафрейм, который выглядит следующим образом:

      Name       width        height   breadth      
0       1         13          90       2    
1       2         101         45       1
2       3         78          6        1      
3       5         11          34       1
4       6         23          8        2

Итак, как видно, название не в последовательности. Между ними отсутствуют файлы. Я хочу сместить значения столбца ширины и высоты на одну строку ниже, если имя находится в последовательности. Если нет, я хочу заполнить ширину и высоту строки как NaN.

Я попробовал следующий код:

diff=data['Name'].diff()

И попытался сделать group_by, используя эту разницу в значении. Но это не сработало.

Я ожидаю результата, как показано ниже:

       Name       width        height   breadth      
0       1         NaN         Nan       2   
1       2         13          90        1
2       3         101         45        1      
3       5         Nan         Nan       1
4       6         11          34        2

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Создайте вспомогательную серию для групп по Series.diff, сравните по Series.ne и Series.cumsum и передайте ее DataFrameGroupBy.shift:

diff = data['Name'].diff().ne(1).cumsum()
data[['width','height']] = data.groupby(diff)['width','height'].shift()
print (data)
   Name  width  height  breadth
0     1    NaN     NaN        2
1     2   13.0    90.0        1
2     3  101.0    45.0        1
3     5    NaN     NaN        1
4     6   11.0    34.0        2
0 голосов
/ 09 мая 2019

Вы можете использовать временный фрейм данных для добавления пустых строк и сдвига значений:

temp = pd.DataFrame({'Name': np.arange(
    data.Name.min(), data.Name.max() + 1)}).merge(data, on='Name', how='left')

temp.iloc(axis=1)[1:] = temp.iloc(axis=1)[1:].shift()

result = pd.DataFrame(data.Name).merge(temp , on='Name')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...