#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 Как решение работает для вас? Пожалуйста, посоветуйте. Спасибо!