панды: импорт csv и сводка по повторяющимся именам столбцов

#python #pandas

Вопрос:

У меня есть csv-файл, представляющий измерения, выполненные в матрице:

  A B C
1
2
3 
 

в формате csv:

  • Первые 2 столбца («Col» и «строка») представляют координаты матрицы
  • Остальные столбцы представляют настройку измерения (0, 1 или 2).

Поскольку измерения повторяются, настройка повторяется: (0,1,2,1,0) столбцы повторяются.

Вот наборы данных

 
Col row 0   1     2    1    0 #these represent measurement setup
1   A   1   0.7   0.5  0.4  0.5
2   B   1   0.4   0.2  0.1  0.1
3   C   1   0.3   0.2  0.1  0.1

 

я хочу:

  • импорт файла
  • поворот для создания столбцов «col — строка — настройка — итерация»

где настройка представляет собой настройку измерения (0,1,2,1,0)

и итерация подсчитывает измерения,выполненные для одного пикселя (col, пара строк) (1,2,3,4,5)

Окончательный набор дат должен выглядеть следующим образом:

        
Col row setup iteration  value   
1   A   0     1          1
1   A   1     2          0.7
1   A   2     3          0.5
1   A   1     4          0.4
1   A   0     5          0.5
2   B   0     1          1
2   B   1     2          0.4
2   B   2     3          0.2
2   B   1     4          0.1
2   B   0     5          0.1
.....etc
 

Ответ №1:

Вы хотите распаковать или расплавить свой фрейм данных:

 df_orig = pd.read_csv('file.csv')
df = df_orig.melt(['Col', 'row'], var_name='setup')
 

Это дает:

     Col row setup  value
0     1   A     0    1.0
1     2   B     0    1.0
2     3   C     0    1.0
3     1   A     1    0.7
4     2   B     1    0.4
5     3   C     1    0.3
6     1   A     2    0.5
7     2   B     2    0.2
8     3   C     2    0.2
9     1   A   1.1    0.4
10    2   B   1.1    0.1
11    3   C   1.1    0.1
12    1   A   0.1    0.5
13    2   B   0.1    0.1
14    3   C   0.1    0.1
 

Поскольку по умолчанию (или для более старой версии) read_csv имя столбца с дубликатом искажено, мы должны отменить настройку столбца:

 df['setup'] = df['setup'].replace('\..*', '', regex=True)
 

Просто добавьте столбец итераций:

 df['iteration'] = 1   df.index // len(df_orig)
 

и отсортируйте фрейм данных:

 df.sort_values(['Col', 'row', 'iteration']).reset_index(drop=True)
 

получить:

     Col row setup  value  iteration
0     1   A     0    1.0          0
1     1   A     1    0.7          1
2     1   A     2    0.5          2
3     1   A     1    0.4          3
4     1   A     0    0.5          4
5     2   B     0    1.0          0
6     2   B     1    0.4          1
7     2   B     2    0.2          2
8     2   B     1    0.1          3
9     2   B     0    0.1          4
10    3   C     0    1.0          0
11    3   C     1    0.3          1
12    3   C     2    0.2          2
13    3   C     1    0.1          3
14    3   C     0    0.1          4