Як змістити стовпець у Pandas DataFrame


101

Я хотів би перенести стовпець у пандах DataFrame, але мені не вдалося знайти спосіб зробити це з документації, не переписавши весь DF. Хтось знає, як це зробити? DataFrame:

##    x1   x2
##0  206  214
##1  226  234
##2  245  253
##3  265  272
##4  283  291

Бажаний вихід:

##    x1   x2
##0  206  nan
##1  226  214
##2  245  234
##3  265  253
##4  283  272
##5  nan  291

3
це справді має бути необов’язковим прапором до функції перемикання
KIC

Відповіді:


155
In [18]: a
Out[18]: 
   x1  x2
0   0   5
1   1   6
2   2   7
3   3   8
4   4   9

In [19]: a.x2 = a.x2.shift(1)

In [20]: a
Out[20]: 
   x1  x2
0   0 NaN
1   1   5
2   2   6
3   3   7
4   4   8

8
Результат відсутній ## 5. Чи є у панд простий спосіб розширити індекс при використанні shift?
Вейлон Уокер

@WaylonWalker Це називається перехідним в NumPy:df['x2'] = np.roll(df['x2'], 1)
Айхан

1
Хтось це зрозумів? №5 досі відсутній
Kritz,

Мені потрібно зсунути 100 стовпців так само, як я можу зробити цикл for?
Вінсент Рой,

2
@Johan, ти намагався додати порожній рядок в кінці перед тим, як змінити його?
MikeyE

8

Вам потрібно скористатися df.shiftтут.
df.shift(i)зміщує весь кадр даних на iодиниці вниз.

Отже, для i = 1:

Вхід:

    x1   x2  
0  206  214  
1  226  234  
2  245  253  
3  265  272    
4  283  291

Вихід:

    x1   x2
0  Nan  Nan   
1  206  214  
2  226  234  
3  245  253  
4  265  272 

Отже, запустіть цей скрипт, щоб отримати очікуваний результат:

import pandas as pd

df = pd.DataFrame({'x1': ['206', '226', '245',' 265', '283'],
                   'x2': ['214', '234', '253', '272', '291']})

print(df)
df['x2'] = df['x2'].shift(1)
print(df)

3
Ласкаво просимо до stackoverflow. Ваша відповідь буде кориснішою, якщо ви надасте якесь пояснення того, як її слід використовувати.
Simon.SA

1
знову ви втратили один рядок №5, який ОП явно хоче
KIC

6

Давайте визначимо фрейм даних з вашого прикладу за

>>> df = pd.DataFrame([[206, 214], [226, 234], [245, 253], [265, 272], [283, 291]], 
    columns=[1, 2])
>>> df
     1    2
0  206  214
1  226  234
2  245  253
3  265  272
4  283  291

Тоді ви можете маніпулювати індексом другого стовпця за допомогою

>>> df[2].index = df[2].index+1

і, нарешті, повторно об’єднати окремі стовпці

>>> pd.concat([df[1], df[2]], axis=1)
       1      2
0  206.0    NaN
1  226.0  214.0
2  245.0  234.0
3  265.0  253.0
4  283.0  272.0
5    NaN  291.0

Можливо, не швидко, але просто для читання. Подумайте про встановлення змінних для імен стовпців та фактичного необхідного зсуву.

Редагувати: Як правило, зсув можливий, df[2].shift(1)як уже розміщено, проте це призведе до припинення перенесення.


Цікаво, чи існує швидкий спосіб зробити це, використовуючи індекс дати, по суті, ви хочете змінити, не обрізаючи наш ряд, і, таким чином, ви повинні вказати додаткові значення індексу. для зміни на одиницю ви б сказали щось на зразок series.shift (-1, fill = [datetime (<деяка дата>)]]). Чи можливо щось подібне? А знайшов тут stackoverflow.com/questions/36042804 / ...
Oldschool

5

Якщо ви не хочете втрачати стовпці, які ви пересунули після кінця вашого кадру даних, просто додайте необхідне число спочатку:

    offset = 5
    DF = DF.append([np.nan for x in range(offset)])
    DF = DF.shift(periods=offset)
    DF = DF.reset_index() #Only works if sequential index

3

Припускаю, імпорт

import pandas as pd
import numpy as np

Спочатку додайте новий рядок з NaN, NaN,...кінцем DataFrame ( df).

s1 = df.iloc[0]    # copy 1st row to a new Series s1
s1[:] = np.NaN     # set all values to NaN
df2 = df.append(s1, ignore_index=True)  # add s1 to the end of df

Це створить новий DF df2. Можливо, є більш елегантний спосіб, але це працює.

Тепер ви можете змінити його:

df2.x2 = df2.x2.shift(1)  # shift what you want

2

Намагаючись відповісти на особисту проблему, подібну до вашої, я знайшов у Pandas Doc те, що, на мою думку, відповіло б на це запитання:

DataFrame.shift (періоди = 1, частота = Немає, вісь = 0) Індекс зсуву на бажану кількість періодів з необов’язковою частотою часу

Примітки

Якщо задано частоту, значення індексу зміщуються, але дані не вирівнюються. Тобто використовуйте частоту, якщо хочете розширити індекс під час зсуву та зберегти вихідні дані.

Сподіваюся допомогти майбутнім питанням у цьому питанні.


0

Ось як я це роблю:

df_ext = pd.DataFrame(index=pd.date_range(df.index[-1], periods=8, closed='right'))
df2 = pd.concat([df, df_ext], axis=0, sort=True)
df2["forecast"] = df2["some column"].shift(7)

В основному я створюю порожній фрейм даних з бажаним індексом, а потім просто об'єдную їх. Але я б дуже хотів бачити це як стандартну функцію в пандах, тому я запропонував вдосконалення для панд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.