Пути улучшения этого цикла, чтобы сделать его более питонизируемым - PullRequest
0 голосов
/ 05 июля 2019

Мне нужно работать между столбцами и строками.Я разработал некоторую базу кода в цикле "for".Я понимаю, что с помощью операций с данными (panda) можно работать лучше, я пробовал разные, но это не сработало.Может быть, вы можете помочь мне.

for i in range(1, len(df)):
    if i == 1:
        df['A'][i] = df['D'][i]
    elif df['B'][i] == 1:
        df['A'][i] = df['A'].shift()[i] + df['C'][i]
    elif df['B'][i] == 0:
        df['A'][i] = df['A'].shift()[i]

Источник:

Date        B   D    X  C   A   
2004-03-03  0.0 1122 59 0.0 0.0 
2004-03-03  0.0 1151 59 0.0 0.0
2004-03-04  0.0 1154 68 0.0 0.0 
2004-03-05  0.0 1156 72 0.0 0.0 
2004-03-08  0.0 1147 38 0.0 0.0 
2004-03-09  0.0 1140 27 0.0 0.0 
2004-03-10  0.0 1123 13 0.0 0.0 
2004-03-11  0.0 1106 8  0.0 0.0 
2004-03-12  1.0 1120 36 14  0.0 
2004-03-15  1.0 1104 24 -16 0.0 
2004-03-16  1.0 1110 35 6   0.0 
2004-03-17  1.0 1123 53 13  0.0

Результат:

Date        B   D    X  C   A   
2004-03-02  0.0 1122 59 0.0 1122    
2004-03-03  0.0 1151 59 0.0 1122    
2004-03-04  0.0 1154 68 0.0 1122    
2004-03-05  0.0 1156 72 0.0 1122    
2004-03-08  0.0 1147 38 0.0 1122    
2004-03-09  0.0 1140 27 0.0 1122    
2004-03-10  0.0 1123 13 0.0 1122    
2004-03-11  0.0 1106 8  0.0 1122    
2004-03-12  1.0 1120 36 14  1135    
2004-03-15  1.0 1104 24 -16 1118    
2004-03-16  1.0 1110 35 6   1124    
2004-03-17  1.0 1123 53 13  1137

1 Ответ

0 голосов
/ 05 июля 2019

Вы могли бы сделать что-то вроде

df[A] = (df['A'] == 1) * (df['A'].shift() + df['C']) + df['A'].shift()[i] + (df['A'] == 0)
df['A'][0] = df['D'][1]

Это не будет использовать цикл, но я предполагаю, что это будет быстрее.Я заменил i = 1 на i = 0, потому что индексирование в информационных фреймах панд начинается с 0, а не 1

...