Извлечение из 2D df и добавление значения в 1D df в python

#python #pandas #dataframe

Вопрос:

Я пытаюсь извлечь информацию из 2d-фрейма данных, в котором у меня есть строки от A до H и столбцы 1-12. Каждая ячейка имеет свой номер. Мой второй фрейм данных содержит только один столбец с объединенной информацией, например A1, A2 и т. Д. Я хочу установить цикл for, чтобы я мог выполнить df1.iloc и выбрать координаты. Но я не хочу вводить 96 строк, поэтому я думаю, что цикл for был бы полезен, но я не знаю, как это сделать. Я довольно новичок, поэтому не знаю многих трюков.

df1 будет:

1 2 3 4 5 6
A 237 543 300 256 343 122
B 435 313 150 635 847 321

df2 будет:

 well=['A1','A2','A3','B1','B2','B3']
 

Я хотел бы сделать df3, который выглядит так:

Что ж Ценность
A1 237
A2 543
A3 300
В1 435
B2 313
B3 150

Пока что у меня есть только:

     df3=pd.DataFrame()
    for i in df2:
        if i.contains('A'):
           row=df1.iloc[1]
           if i.contains('1'):
              value=row.iloc[1]
        df3.append(i,value)
 

Я знаю, что col # всегда будет одним и тем же для iloc.
Итак, могу ли я назначить A-H как 1-8, а затем каким-то образом выбрать число после буквы в df2 в качестве значения iloc?

Ответ №1:

Один из вариантов-туда stack df1 и reindex обратно well :

 df3 = df1.stack()
df3.index = df3.index.map(lambda s: ''.join(map(str, s)))
df3 = df3.reindex(df2['well']).reset_index(name='Value')
 

df3 :

   Well  Value
0   A1    237
1   A2    543
2   A3    300
3   B1    435
4   B2    313
5   B3    150
 

Используемые фреймы данных:

 import pandas as pd

df1 = pd.DataFrame({
    1: {'A': 237, 'B': 435}, 2: {'A': 543, 'B': 313},
    3: {'A': 300, 'B': 150}, 4: {'A': 256, 'B': 635},
    5: {'A': 343, 'B': 847}, 6: {'A': 122, 'B': 321}
})

df2 = pd.DataFrame({'well': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})
 

Объяснения:

  1. Стек производит серию:
 df3 = df1.stack()
 

df3 :

 A  1    237
   2    543
   3    300
   4    256
   5    343
   6    122
B  1    435
   2    313
   3    150
   4    635
   5    847
   6    321
dtype: int64
 

  1. Сверните мультииндекс в один индекс с помощью Index.map :
 df3.index = df3.index.map(lambda s: ''.join(map(str, s)))
 

df3 :

 A1    237
A2    543
A3    300
A4    256
A5    343
A6    122
B1    435
B2    313
B3    150
B4    635
B5    847
B6    321
dtype: int64
 

  1. Хватай well из df2 и reindex :
 df3 = df3.reindex(df2['well'])
 
 Well
A1    237
A2    543
A3    300
B1    435
B2    313
B3    150
dtype: int64
 

*Если well-это a list , как это показано в ОП, превратите его в a Series с именем well и reindex от этого вместо этого:

 well = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']
df3 = df3.reindex(pd.Series(well, name='well'))
 

Или reindex непосредственно из list , но затем ось нужно будет переименовать перед сбросом индекса:

 well = ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']
df3 = df3.reindex(well).rename_axis(index='Well')
 

  1. reset_index чтобы преобразовать в фрейм данных (и присвоить Value столбцу имя):
 df3 = df3.reindex(df2['well']).reset_index(name='Value')
 

df3 :

   Well  Value
0   A1    237
1   A2    543
2   A3    300
3   B1    435
4   B2    313
5   B3    150
 

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

1. Что, если ‘df1 = pd.Фрейм данных({ 1: {‘A’: 237, ‘B’: 435, ‘C’:900}, 2: {‘A’: 543, ‘B’: 313, ‘C’:1200}, 3: {‘A’: 300, ‘B’: 150, ‘C’:1600}, 4: {‘A’: 256, ‘B’: 635, ‘C’:900}, 5: {‘A’: 343, ‘B’: 847, ‘C’:1200}, 6: {«A»: 122, «B»: 321, «C»: 1600}}) «и мне нужен кадр данных:» df3=pd.Кадр данных ({«имя»: {«A1»: 237, «A2»: 543, «A3»: 300, «A4»: 256, «A5»: 343, «A6»: 122, «B1»: 435, «B2»: 313, «B3»: 150, «B4»: 635, «B5′: 847,’ B6′: 321},’ Время’: {‘A1’: 900, ‘A2′: 1200,’A3′: 1600,’A4′: 900,’A5′: 1200,’A6′: 1600,’B1′: 900,’B2′: 1200,’B3′: 1600,’B4′: 900,’B5′: 1200,’B6′: 1600}})’

2. На самом деле это кажется другим вопросом из-за того, как сохраняются дополнительные столбцы на основе индекса C. У меня недостаточно места в комментариях, чтобы полностью изложить свои мысли, и нет смысла изменять этот вопрос, который был задан и на который был дан ответ. Я был бы рад взглянуть на ваш новый вопрос, в котором конкретно описывается, как должна произойти эта трансформация, а также любые другие соответствующие факторы, которые было бы трудно включить в комментарии.