У меня есть датафрейм, DF, который выглядит примерно так

   col1  col2

A   2   2   
B   4   1   
C   0   0   
D   1   1   
E   2   2   

И хотел бы добавить два столбца, чтобы для каждой строки i новый столбец col3 содержал значение df.loc [i-1, col1], а col4 содержал значение df.loc [i-2, col1].

   col1 col2 col3 col4

A   2   2   Nan Nan 
B   4   1   2   Nan
C   0   0   4   2
D   1   1   0   4
E   2   2   1   0

На данный момент я перебираю цикл данных и «вручную» добавляю каждое значение. Есть ли более разумный способ решить эту проблему, чем мой подход?

Мое решение методом грубой силы (без учета первых 2 строк):

for i in range(2,df.shape[0]):
    for j in range(2):
        df.iloc[i,j+2] = df.iloc[i-1-j, j]
2
ThomasWear 11 Апр 2019 в 17:44

2 ответа

Лучший ответ

С map и pd.concat

df.join(
    pd.concat(
        dict(enumerate(map(df.col1.shift, range(1, 3)), 3)), axis=1
    ).add_prefix('col')
)

   col1  col2  col3  col4
A     2     2   NaN   NaN
B     4     1   2.0   NaN
C     0     0   4.0   2.0
D     1     1   0.0   4.0
E     2     2   1.0   0.0
2
piRSquared 11 Апр 2019 в 15:06

Используя shift

for x in range(2): 
    df['col'+str(x+3)]=df.col1.shift(x+1)
df
Out[152]: 
   col1  col2  col3  col4
A     2     2   NaN   NaN
B     4     1   2.0   NaN
C     0     0   4.0   2.0
D     1     1   0.0   4.0
E     2     2   1.0   0.0
1
YO and BEN_W 11 Апр 2019 в 14:49