#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
asindex
для 2-го фрейма данных?2. Не требуется, условие в функции apply не принимает другие столбцы
3. Я получаю
NameError: ("name 'name' is not defined", occurred at index SP-RS-001')
4. Это то же самое, что я написал выше!