Pandas DataFrame에서 열을 이동하는 방법


101

Pandas에서 열을 이동하고 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
이것은 정말로 shift 기능에 대한 선택적 플래그 여야합니다
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

9
결과에 ## 5가 없습니다. 시프트를 사용할 때 pandas에서 인덱스를 확장하는 쉬운 방법이 있습니까?
Waylon Walker

@WaylonWalker 그것은 numpy에서 롤링이라고 불립니다 :df['x2'] = np.roll(df['x2'], 1)
ayhan

1
아무도 이것을 알아 냈습니까? # 5가 아직 누락되었습니다
Kritz 2018

같은 방식으로 100 개의 열을 이동해야합니다. for 루프를 만들려면 어떻게해야합니까?
Vincent Roye

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 2010 년

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)으로 이미 게시 된 대로 이동이 가능 하지만 이월을 차단합니다.


이 작업을 수행하는 빠른 방법이 있는지 궁금합니다. 날짜 인덱스를 사용하면 기본적으로 시리즈를 자르지 않고 이동하고 싶으므로 추가 인덱스 값을 지정해야합니다. 1 씩 시프트하려면 series.shift (-1, fill = [datetime (<some date>)])와 같이 말할 수 있습니다. 이와 같은 것이 가능합니까? 아 여기에서 찾았어요 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 (periods = 1, freq = None, axis = 0) 선택적 시간 주파수를 사용하여 원하는 기간 수만큼 인덱스 이동

노트

freq가 지정되면 인덱스 값이 이동되지만 데이터는 다시 정렬되지 않습니다. 즉, 원래 데이터를 이동하고 보존 할 때 인덱스를 확장하려면 freq를 사용하십시오.

이 문제에 대한 향후 질문에 도움이되기를 바랍니다.


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)

기본적으로 원하는 인덱스가있는 빈 데이터 프레임을 생성 한 다음 함께 연결합니다. 그러나 나는 이것을 pandas의 표준 기능으로보고 싶기 때문에 pandas에 대한 개선 사항제안했습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.