Получение соотношения значений сводного фрейма данных в Pandas

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

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

 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      ....
  

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

Ответ №1:

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

 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. Почему len(df1) ?

2. @harry04 в основном объединяет и вспомогательный df, чтобы получить одинаковую длину df1 перед разделением

3. Это дает мне намного больше строк, чем ожидалось.

4. @harry04 убедитесь, что количество столбцов и строк в вспомогательном df такое же, как у столбцов, которые вы хотите разделить (как в примере)

Ответ №2:

 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
  

Комментарии:

1. Извините, но ваш вывод не соответствует моим требованиям. Почему в приведенном выше выводе CID перечислены WR s?..

Ответ №3:

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

Комментарии:

1. Должен ли я также устанавливать C ID as index для 2-го фрейма данных?

2. Не требуется, условие в функции apply не принимает другие столбцы

3. Я получаю NameError: ("name 'name' is not defined", occurred at index SP-RS-001')

4. Это то же самое, что я написал выше!