TL; DR
Рассмотрим следующий pd.Dataframe:
a0 d2 b3 t4
0 1 2 3 0.8
1 3 4 3 9.0
2 5 6 5 2.5
3 7 7 7 8.0
Я хочу разделить столбцы, заданные маской cols = ['a0', 'd2', 'b3']
по строкам (элементом из строки, например a0
).Следующий код дает желаемый результат:
# just to surpress pandas chain-assignment warning
pd.options.mode.chained_assignment = None
d = pd.DataFrame([[1,2,3,.8], [3,4,3,9], [5,6,5,2.5], [7,7,7,8]],columns=["a0", "d2", "b3", "t4"])
# mask
cols = ['a0', 'd2', 'b3']
for i, row in d.iterrows():
a0 = float(row["a0"])
for k, v in row.iteritems():
if k in cols:
d[k][i] /= a0
Вывод:
a0 d2 b3 t4
0 1 2 3 0.8
1 1 1 1 9.0
2 1 1 1 2.5
3 1 1 1 8.0
Вопрос
Мой вопрос: есть ли ещесложный способ выполнения вышеуказанного кода?Я имею в виду выражение, похожее на
d.loc[:, cols] /= d.ix[:, ['a0']],
, которое, я думаю, почти выполняет свою работу, но дает мне NaN для делений:
a0 d2 b3 t4
0 1.0 NaN NaN 0.8
1 1.0 NaN NaN 9.0
2 1.0 NaN NaN 2.5
3 1.0 NaN NaN 8.0
Может кто-нибудь дать мне подсказку, накак исправить / заменить последнее выражение, если оно работает, как описано (и выполняет деление с плавающей запятой)?Решение должно быть достаточно универсальным, чтобы использовать маски размером ~ 500, так как имена столбцов априори мне не известны, и я генерирую их с помощью регулярных выражений.