Получение отношения значений поворотного кадра данных в Pandas - PullRequest
0 голосов
/ 19 марта 2019

Один из моих данных содержит

WR          # WR
SP-RS-001    191
SP-RS-004    120
CO-CL-003    130
AN-AS-003    127

, а другой содержит

C ID      SP-RS-001    SP-RS-004  CO-CL-003   AN-AS-003 ....
C-001        4            15         19         18      ....
C-002        7            11         10          0      ....
C-004        0             5          7         12      ....
C-005        1             1          4          2      ....

Как я могу создать другой фрейм данных, который дает мне отношение / процент от значения от второго фрейма данных к значению строки первого фрейма данных, соответствующей ему. Итак, результат должен выглядеть так -

C ID      SP-RS-001      SP-RS-004    CO-CL-003    AN-AS-003      ....
C-001        4/191         15/120      19/130         18/127      ....
C-002        7/191         11/120      10/130          0/127      ....
C-004        0/191          5/120       7/130         12/127      ....
C-005        1/191          1/120       4/130          2/127      ....

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

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Вы также можете попробовать сделать:

help_df=pd.concat([df.set_index('WR').T]*len(df1)).reset_index(drop=True)
df1.iloc[:,1:]=df1.iloc[:,1:].div(help_df)
print(df1)

    C ID  SP-RS-001  SP-RS-004  CO-CL-003  AN-AS-003
0  C-001  0.020942   0.125000   0.146154   0.141732 
1  C-002  0.036649   0.091667   0.076923   0.000000 
2  C-004  0.000000   0.041667   0.053846   0.094488 
3  C-005  0.005236   0.008333   0.030769   0.015748 

Где print(help_df) - это, по сути, вспомогательный df для деления:

   WR  SP-RS-001  SP-RS-004  CO-CL-003  AN-AS-003
    0   191        120        130        127      
    1   191        120        130        127      
    2   191        120        130        127      
    3   191        120        130        127   
1 голос
/ 19 марта 2019
def check(text):
    l = []
    for i in text.index:
        #print(i)
        temp = df1[df1['WR'] == i].reset_index()
        if len(temp) >= 1:
            #print(temp['#WR'][0])
            l.append(str(text[i])+'/'+str(temp['#WR'][0]))
    return l 

df2[['SP-RS-001', 'SP-RS-004', 'CO-CL-003', 'AN-AS-003']] = df2.apply(check, axis=1)

main = df2[['SP-RS-001', 'SP-RS-004', 'CO-CL-003', 'AN-AS-003']].T.reset_index()
main.columns=['CID', 'SP-RS-001', 'SP-RS-004', 'CO-CL-003', 'AN-AS-003']

Выход

         CID SP-RS-001 SP-RS-004 CO-CL-003 AN-AS-003
0  SP-RS-001     4/191    15/120    19/130    18/127
1  SP-RS-004     7/191    11/120    10/130     0/127
2  CO-CL-003     0/191     5/120     7/130    12/127
3  AN-AS-003     1/191     1/120     4/130     2/127
0 голосов
/ 19 марта 2019

Вы можете установить WR в качестве индекса для первого кадра данных, w.r.t для имени столбца второго кадра данных, значение которого можно получить с помощью df.loc

df.set_index('WR',inplace=True)

            #WR.1
WR  
SP-RS-001   191
SP-RS-004   120
CO-CL-003   130
AN-AS-003   127


df1
    C ID    SP-RS-001   SP-RS-004   CO-CL-003   AN-AS-003
0   C-001   4   15  19  18
1   C-002   7   11  10  0
2   C-004   0   5   7   12
3   C-005   1   1   4   2

df1.apply(lambda x: x/int(df.loc[x.name]) if x.name in df.index else x)


Out:

     C ID   SP-RS-001   SP-RS-004   CO-CL-003   AN-AS-003
0   C-001   0.020942    0.125000    0.146154    0.141732
1   C-002   0.036649    0.091667    0.076923    0.000000
2   C-004   0.000000    0.041667    0.053846    0.094488
3   C-005   0.005236    0.008333    0.030769    0.015748
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...