Как получить доступ к номинальным значениям и неопределенностям в фрейме данных Pandas?

#python #pandas #uncertainty

Вопрос:

Я использую модуль неопределенностей вместе с Pandas. В настоящее время я могу вывести фрейм данных с неопределенностями вместе в электронную таблицу. Моя основная цель — записать фрейм данных с неопределенностями в соседнем столбце. Но как получить доступ к номинальным значениям или неопределенностям внутри фреймов данных. MWE приведен ниже.

Текущий результат

A B
63.2 /-0.9 75.4 /-0.9
41.94 /-0.05 53.12 /-0.21
4.1 /-0.4 89.51 /-0.32
28.2 /-0.5 10.6 /-0.6
25.8 /-0.9 39.03 /-0.08
27.26 /-0.09 44.61 /-0.35
25.04 /-0.13 37.7 /-0.6
2.4 /-0.5 50.0 /-0.8
0.92 /-0.21 3.1 /-0.5
57.69 /-0.34 21.8 /-0.8

Желаемый результат

A /- B /-
63.2 0.9 75.4 0.9
41.94 0.05 53.12 0.21
4.1 0.4 89.51 0.32
28.2 0.5 10.6 0.6
25.8 0.9 39.03 0.08
27.26 0.09 44.61 0.35
25.04 0.13 37.7 0.6
2.4 0.5 50 0.8
0.92 0.21 3.1 0.5
57.69 0.34 21.8 0.8

MWE

 from uncertainties import unumpy
import pandas as pd
import numpy as np


A_n = 100 * np.random.rand(10)
A_s = np.random.rand(10)

B_n = 100 * np.random.rand(10)
B_s = np.random.rand(10)

AB = pd.DataFrame({'A':unumpy.uarray(A_n, A_s), 'B': unumpy.uarray(B_n, B_s)})


AB_writer = pd.ExcelWriter('A.xlsx', engine = 'xlsxwriter', options={'strings_to_numbers': True})
AB.to_excel(AB_writer, sheet_name = 'Data', index=False, na_rep='nan')
AB_writer.close()
 

Обновить

Я забыл упомянуть, что AB создается не так, как показано в MWE, а является результатом предыдущих вычислений, не приведенных в MWE. Ради MWE я создал AB. Короче говоря, у меня не будет доступа к номинальным значениям и значениям неопределенности A и B.

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

1. Если у вас нет доступа к номинальным значениям A и B и значениям неопределенности, как вы можете обработать эти 2 столбца и преобразовать их? Или у вас есть только их объединенные значения, например 63.2 /-0.9 , в тексте?

2. У меня есть только их объединенные значения (после многих вычислений).

Ответ №1:

Вы можете сопоставить столбцы, чтобы получить результат, который вы ищете. Следующий код сопоставляет A столбец (убедитесь, что не назначайте два столбца одному и тому же ключу столбца ' /-' ).

 AB[['A', ' /-']] = AB.A.apply(lambda x: str(x).split(' /-')).to_list()
 

Ответ №2:

Просто разделите их на разные столбцы:

 Au = unumpy.uarray(A_n, A_s)
Bu = unumpy.uarray(B_n, B_s)
AB = pd.DataFrame({'A': unumpy.nominal_values(Au), 'A /-': unumpy.std_devs(Au), 'B': unumpy.nominal_values(Bu), 'B /-': unumpy.std_devs(Bu)})
 

Ответ №3:

Вы можете использовать str.split() для разделения каждого столбца на один столбец основного значения и один столбец неопределенностей следующим образом:

 # add the column labels here if you have more columns to process
# e.g. `for col in AB[['A', 'B', 'C']]:` if you want to process columns `A`, `B` and `C`
for col in AB[['A', 'B']]:     
    AB[[col, f'{col} /-']] = AB[col].str.split(r' /-', expand=True)

# sort the columns to put the related columns together
AB = AB.sort_index(axis=1)    
 

Не рекомендуется иметь 2 столбца с одинаковыми метками столбцов в одном фрейме данных. Здесь мы называем /- столбцы вместе с их соответствующим именем исходного столбца, чтобы различать их.

Здесь мы также используем .sort_index() для сортировки имена столбцов, чтобы поместить связанные столбцы рядом друг с другом.

Результат:

 print(AB)

       A  A /-      B  B /-
0   63.2   0.9   75.4   0.9
1  41.94  0.05  53.12  0.21
2    4.1   0.4  89.51  0.32
3   28.2   0.5   10.6   0.6
4   25.8   0.9  39.03  0.08
5  27.26  0.09  44.61  0.35
6  25.04  0.13   37.7   0.6
7    2.4   0.5   50.0   0.8
8   0.92  0.21    3.1   0.5
9  57.69  0.34   21.8   0.8
 

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

1. Я получаю сообщение об ошибке ValueError: Columns must be same length as key

2. @TomKurushingal У вас есть несколько столбцов без /- знака? Если да, пожалуйста, выполните цикл по столбцам, имеющим /- только знак, как я упоминал в комментарии к коду. Например. for col in AB[['A', 'B']] только для столбцов A и B со /- знаком

3. @TomKurushingal Цикл в первой части призван помочь вам автоматизировать цикл по всем столбцам со /- знаком. Конечно, если у вас есть только 1 или 2 столбца, вы можете сделать это вручную, например AB[['A', 'A /-']] = AB['A'].str.split(r' /-', expand=True) , а также AB[['B', 'B /-']] = AB['B'].str.split(r' /-', expand=True) по одному столбцу за раз.

4. @TomKurushingal Я отредактировал свои коды выше, чтобы обрабатывать только столбцы A и B как в ваших образцах данных. Если у вас есть другие столбцы для обработки, просто добавьте их в список столбцов. например, используйте for col in AB[['A', 'B', 'C']]: для первой строки кодов, если вы хотите обработать столбцы A , B и C

5. @TomKurushingal Как решение работает для вас? Пожалуйста, посоветуйте. Спасибо!