Python-pandas.Dataframe: Деление столбцов, заданных массивом масок, построчно на значение - PullRequest
0 голосов
/ 13 марта 2019

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, так как имена столбцов априори мне не известны, и я генерирую их с помощью регулярных выражений.

1 Ответ

0 голосов
/ 13 марта 2019

попробуй:

d[cols] = d[cols].div(d['a0'], axis = 0).astype('int')

out:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...