Выполнить умножение строк в кадре данных - PullRequest
1 голос
/ 30 октября 2019

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

date      A      B     C     D     E    ...
date1     0,03  0,02  0,01   0,01 0,234
date2     0,03  0,02  0,01   0,01 0,234
date3     0,03  0,02  0,01   0,01 0,234
date4     0,03  0,02  0,01   0,01 0,234

числа не совпадают и имеют много десятичных значений. Я хочу создать в другом фрейме данных следующее:

date      value      
date1     (1+0,03)*(1+0,02)*(1+0,01)*(1+0,01)*(1+0,234)
date2     (1+0,03)*(1+0,02)*(1+0,01)*(1+0,01)*(1+0,234)
date3     (1+0,03)*(1+0,02)*(1+0,01)*(1+0,01)*(1+0,234)
date4     (1+0,03)*(1+0,02)*(1+0,01)*(1+0,01)*(1+0,234)

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

1 Ответ

3 голосов
/ 30 октября 2019

При необходимости создайте индекс по датам с помощью DataFrame.set_index, затем добавьте 1 для каждого значения и используйте DataFrame.prod:

#if not numeric values replace , and convert to floats
#df = df.replace(',','.', regex=True)
df1 = df.set_index('date').astype(float).add(1).prod(axis=1).reset_index(name='value')
print (df1)
    date     value
0  date1  1.322499
1  date2  1.322499
2  date3  1.322499
3  date4  1.322499

Testс отсутствующим значением:

print (df)
    date     A     B     C     D      E
0  date1  0,03  0,02  0,01  0,01    NaN
1  date2  0,03  0,02  0,01  0,01  0,234
2  date3  0,03  0,02  0,01  0,01  0,234
3  date4  0,03  0,02  0,01  0,01  0,234

df = df.replace(',','.', regex=True)

print (df.set_index('date').astype(float).add(1))
          A     B     C     D      E
date                                
date1  1.03  1.02  1.01  1.01    NaN
date2  1.03  1.02  1.01  1.01  1.234
date3  1.03  1.02  1.01  1.01  1.234
date4  1.03  1.02  1.01  1.01  1.234

df1 = df.set_index('date').astype(float).add(1).prod(axis=1).reset_index(name='value')
print (df1)
    date     value
0  date1  1.071717
1  date2  1.322499
2  date3  1.322499
3  date4  1.322499
...