Заполните кадр данных pandas, считая строки в массиве и добавляя их значения из массива - PullRequest
2 голосов
/ 26 сентября 2019

1) массив NumPy r, который состоит из строк.

import numpy as np
r = np.array([['S', 'S'],['S', 'V1'],['S', 'V2'],['V1', 'S'],['V1', 'V1']])

2) массив NUMPY acc значения.Первое значение относится к первому элементу двумерного массива r, а второе значение относится ко второму элементу двумерного массива r

acc = np.array([0.613,0.387])

3) Вопрос: Я хочу заполнить фрейм данных df1.Например: Row1) Массив r[0]=['S', 'S'] содержит 'S' в обоих, затем заполните S = 0,613 + 0,387 = 1,0 в df1, а V1 и V2 в df1 будут равны нулю, поскольку они несуществуют в массиве.Row2) Массив r[1]=['S', 'V1'] содержит один 'S', затем заполните S = 0,613 и V1=0.387 в df1 и V2=0 (не существует) ....... и т. Д.,

Желаемый выход:

import pandas as pd
df1 = pd.DataFrame({'S':[1,0.613,0.613,0.387,0], 'V1': [0,0.387,0,0.613,1],'V2': [0,0,0.387,0,0]})
print(df1)  

        S     V1     V2
0  1.000  0.000  0.000
1  0.613  0.387  0.000
2  0.613  0.000  0.387
3  0.387  0.613  0.000
4  0.000  1.000  0.000

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Вы можете сложить кадр данных, отобразить значения и повернуть обратно:

s = pd.DataFrame(r).stack().reset_index(name='val')

s['level_1'] = acc[s['level_1']]

s.pivot_table(index='level_0', 
              columns='val', 
              values='level_1', 
              aggfunc='sum', 
              fill_value=0)

Выход:

val          S     V1     V2
level_0                     
0        1.000  0.000  0.000
1        0.613  0.387  0.000
2        0.613  0.000  0.387
3        0.387  0.613  0.000
4        0.000  1.000  0.000
0 голосов
/ 26 сентября 2019

Другой способ использования pd.get_dummies(), np.vectorize и df.groupby() на axis=1:

df=pd.get_dummies(pd.DataFrame(r),prefix='',prefix_sep='')
s=pd.Series(acc,index=range(1,len(acc)+1))

final=(pd.DataFrame(np.vectorize(s.get)(np.where(df.eq(1),df.cumsum(axis=1),df)),
            columns=df.columns).groupby(df.columns,axis=1).sum())

       S     V1     V2
0  1.000  0.000  0.000
1  0.613  0.387  0.000
2  0.613  0.000  0.387
3  0.387  0.613  0.000
4  0.000  1.000  0.000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...