Pandas DataFrame에서 열을 이동하는 방법
팬더의 칼럼을 이동하고 싶습니다.DataFrame
, 전체 DF를 다시 작성하지 않고서는 문서에서 할 수 있는 방법을 찾을 수 없었습니다.할 줄 아는 사람?데이터 프레임:
## 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
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
사용하셔야 합니다.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)
예에서 데이터 프레임을 정의합니다.
>>> 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)
그러나 이미 게시된 것처럼 이월이 끊어질 것입니다.
데이터 프레임의 끝을 지나 이동하는 열을 잃지 않으려면 먼저 필요한 숫자를 추가하기만 하면 됩니다.
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
수입품인 것 같습니다.
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
그것은 새로운 DFdf2를 만들어 낼 것입니다.더 우아한 방법이 있을지도 모르지만 이 방법은 효과가 있습니다.
이제 이동할 수 있습니다.
df2.x2 = df2.x2.shift(1) # shift what you want
팬더 독에서 발견한 당신의 것과 유사한 개인적인 문제에 답하려고 노력하는 중에 이 질문에 대답할 수 있을 것 같습니다.
데이터 프레임.shift(shift=1, freq=Axis, axis=0) 원하는 주기 수로 Shift 인덱스(옵션 시간 freq)
메모들
freq가 지정된 경우 인덱스 값은 이동되지만 데이터는 재정렬되지 않습니다.즉, 이동할 때 인덱스를 확장하고 원본 데이터를 보존하려면 freq를 사용합니다.
이 문제에 대한 향후 질문에 도움이 되기를 바랍니다.
df3
1 108.210 108.231
2 108.231 108.156
3 108.156 108.196
4 108.196 108.074
... ... ...
2495 108.351 108.279
2496 108.279 108.669
2497 108.669 108.687
2498 108.687 108.915
2499 108.915 108.852
df3['yo'] = df3['yo'].shift(-1)
yo price
0 108.231 108.210
1 108.156 108.231
2 108.196 108.156
3 108.074 108.196
4 108.104 108.074
... ... ...
2495 108.669 108.279
2496 108.687 108.669
2497 108.915 108.687
2498 108.852 108.915
2499 NaN 108.852
이렇게 하면 됩니다.
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)
기본적으로 나는 원하는 인덱스를 가진 빈 데이터 프레임을 생성하고 그들을 연결하는 것입니다.하지만 저는 이것을 팬더의 기본 특징으로 보고 싶어서 팬더에게 개선을 제안했습니다.
저는 팬더를 처음 접하는 사람이고, 질문을 이해하지 못할 수도 있지만, 이 해결책은 제 문제에 효과가 있었습니다.
# Shift contents of column 'x2' down 1 row
df['x2'] = df['x2'].shift()
또는 'x2' 내용이 1행 아래로 이동된 새 열을 작성하려면
# Create new column with contents of 'x2' shifted down 1 row
df['x3'] = df['x2'].shift()
이를 파악하는 동안 시프트() 공식 문서를 읽었지만, 저에게는 별 의미가 없으며, 이 특정 행동을 참조하는 예도 없습니다.
열 'x2'의 마지막 행은 데이터 프레임의 끝에서 효과적으로 밀려납니다.시프트()가 이 동작을 변경할 수 있는 플래그를 가질 것으로 예상했지만 아무것도 찾을 수 없습니다.
언급URL : https://stackoverflow.com/questions/10982089/how-to-shift-a-column-in-pandas-dataframe
'bestsource' 카테고리의 다른 글
여러 데이터 프레임 열을 기준으로 주파수 카운트 가져오기 (0) | 2023.09.11 |
---|---|
C/C++에서 %(모듈러스)를 사용할 수 있는 대안이 있습니까? (0) | 2023.09.11 |
"mvn clean install" 실행 중 WARN 메시지 수정 방법 (0) | 2023.09.11 |
약속을 사용하여 node.js에서 MySQL 반환 값을 처리합니다. (0) | 2023.09.06 |
스프링 주석 @Repository 및 @Service (0) | 2023.09.06 |