Как индексировать имена столбцов из одного df в другую серию df?

#python #pandas #dataframe #multi-index

#python #pandas #фрейм данных #многоиндексный

Вопрос:

У меня есть 2 фрейма данных, 1 с необработанными данными (df), а другой с шаблоном, описывающим, что в каком колодце. Как проиндексировать имена столбцов ‘A1’ из df с помощью шаблона столбца well_id ‘A1’, который находится в серии, чтобы получить имя образца?

Так экспортируются необработанные данные, поэтому я стараюсь не делать это без изменения входных данных.

Конечная цель состоит в том, чтобы при построении данных df использовать шаблон «Name» для определенного образца.

Теперь мой пример показывает, что я использую столбец «Name» целиком (что неверно) вместо только правильного имени для каждого образца.

 import pandas as pd
import re
import matplotlib.pyplot as plt 

df = pd.DataFrame({'time': [0.1, 0.2, 0.3], 
                    'A1': [1000, 2000, 3000], 
                    'A12': [1500, 2000, 3000], 
                    'B1': [4500, 5000, 6000], 
                    'B12': [4000, 5000, 6000]})

template = pd.DataFrame({'well_id': ['A1', 'A12', 'B1', 'B12'],
                         'name': ['Sample1', 'Sample2', 'Sample3', 'Sample4']})

plt.plot(df.time, df.iloc[:,1:], label=template['name']) 
plt.legend()
  

Итак, я изолировал well_id из df, но не уверен, как теперь связать их с шаблоном.

 well_id = list(filter(re.compile('[A-H][1-9]$|[A-H][1][0-2]$').match, df.columns))
  

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

1. каков ожидаемый результат?

2. Отличный вопрос, я использую данные в df для построения графиков, поэтому все, что позволит мне визуализировать имя образца или группы по имени, будет работать для меня. Например, я не знаю, как перевести это A1 из df == A1 из шаблона.

3. pd.merge(template, df.T, how='left', left_on='Well_id', right_index=True) что вам нужно?

4. Если бы в df был «well_id», я думаю, это сработало бы, но его нет.

5. Если вы можете показать выходные данные df так, как вы показали нам входные данные, это помогло бы. Английский не является моим родным языком, поэтому я понимаю данные более четко, чем объяснения.

Ответ №1:

Допустим, вы хотите объединить все имена примеров с каждым из заданных значений, вы можете сначала объединить фреймы данных, а затем выполнить groupby включение name . Используя это, вы можете вычислить, например, среднее значение для каждого имени, подобного этому, которое можно использовать для дальнейшего построения графика:

 import pandas as pd
import re
import matplotlib.pyplot as plt 

df = pd.DataFrame({'time': [0.1, 0.2, 0.3], 
                    'A1': [1000, 2000, 3000], 
                    'A12': [1500, 2000, 3000], 
                    'B1': [4500, 5000, 6000], 
                    'B12': [4000, 5000, 6000]})

template = pd.DataFrame({'well_id': ['A1', 'A12', 'B1', 'B12'],
                         'name': ['Sample1', 'Sample2', 'Sample3', 'Sample4']})

df1 = pd.merge(template, df.T, how='left', left_on='well_id', right_index=True)
df1.columns = ['well_id', 'name', 'val_1', 'val_2', 'val_3']
print(df1.head())
  

Вывод df1.head() выглядит следующим образом:

   well_id     name   val_1   val_2   val_3
0      A1  Sample1  1000.0  2000.0  3000.0
1     A12  Sample2  1500.0  2000.0  3000.0
2      B1  Sample3  4500.0  5000.0  6000.0
3     B12  Sample4  4000.0  5000.0  6000.0
  

Как только у вас есть df1 , вы можете объединить данные и отобразить их следующим образом:

 df1.groupby('name').mean().plot.line()
plt.title("Values Grouped on Sample Names", size=20)
plt.show()
  

График значений, сгруппированных по именам примеров

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

1. Спасибо! Я не могу поверить, что я просто искал функцию транспонирования, теперь это кажется таким очевидным. Я пошел в направлении сводных таблиц и мультииндексации, которые просто стали слишком сложными слишком быстро.