Python Pandas .loc обновляет 2 столбца одновременно - PullRequest
0 голосов
/ 13 июня 2018

Я сталкиваюсь с проблемой в пандах, где я выполняю много изменений в данных.Но в конце концов я не знаю, какое изменение вызвало окончательное состояние значения в столбце.

Например, я изменяю объемы следующим образом.Но я запускаю много проверок, подобных этой:

# Last check 
for i in range(5):
    df_gp.tail(1).loc[ (df_gp['volume']<df_gp['volume'].shift(1)) | (df_gp['volume']<0.4),['new_volume']  ] = df_gp['new_volume']*1.1

Я хочу обновить не только столбец 'new_volume', но и столбец 'commentary', если условия выполнены.

Возможно ли этодобавить его куда-нибудь, чтобы я «комментировал» обновлялся одновременно с «новым_объемом»?

Спасибо!

1 Ответ

0 голосов
/ 13 июня 2018

Да, это возможно по assign, но, на мой взгляд, менее читабельно, лучше обновить каждый столбец отдельно с помощью логической маски, кешируемой в переменной:

df_gp = pd.DataFrame({'volume':[.1,.3,.5,.7,.1,.7],
                     'new_volume':[5,3,6,9,2,4],
                     'commentary':list('aaabbb')})

print (df_gp)
   volume  new_volume commentary
0     0.1           5          a
1     0.3           3          a
2     0.5           6          a
3     0.7           9          b
4     0.1           2          b
5     0.7           4          b

#create boolean mask and assign to variable for reuse
m = (df_gp['volume']<df_gp['volume'].shift(1)) | (df_gp['volume']<0.4)

#change columns by assign by condition and assign back only filtered columns 
c = ['commentary','new_volume']
df_gp.loc[m, c] = df_gp.loc[m, c].assign(new_volume=df_gp['new_volume']*1.1
                                         commentary='updated')
print (df_gp)
   volume  new_volume commentary
0     0.1         5.5    updated
1     0.3         3.3    updated
2     0.5         6.0          a
3     0.7         9.0          b
4     0.1         2.2    updated
5     0.7         4.0          b

#multiple filtered column by scalar
df_gp.loc[m, 'new_volume'] *= 1.1
#append new value to filtered column
df_gp.loc[m, 'commentary'] = 'updated'
print (df_gp)
   volume  new_volume commentary
0     0.1         5.5    updated
1     0.3         3.3    updated
2     0.5         6.0          a
3     0.7         9.0          b
4     0.1         2.2    updated
5     0.7         4.0          b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...