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
답변
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
새로운 DF df2가 생성됩니다. 더 우아한 방법이 있지만 이것은 작동합니다.
이제 변경할 수 있습니다.
df2.x2 = df2.x2.shift(1) # shift what you want
답변
개인적인 문제에 답하려고 노력 중이며 Pandas Doc 에서이 질문에 답할 것이라고 생각하는 것과 비슷한 것을 찾았습니다 .
DataFrame.shift (periods = 1, freq = None, axis = 0) 선택적 시간 주파수를 사용하여 원하는 기간 수만큼 인덱스 이동
노트
freq가 지정되면 인덱스 값이 이동되지만 데이터는 다시 정렬되지 않습니다. 즉, 원래 데이터를 이동하고 보존 할 때 인덱스를 확장하려면 freq를 사용하십시오.
이 문제에 대한 향후 질문에 도움이되기를 바랍니다.
답변
이것이 내가하는 방법입니다.
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에 대한 개선 사항 을 제안했습니다 .