Python: правильно создавать, писать и читать MultiIndex pd в CSV - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы создать фрейм данных pandas с несколькими столбцами, каждый из которых имеет больше и разные вложенные столбцы.Затем я хочу записать его в CSV и прочитать из него, сохраняя право на индексирование.

Вот пример:

col_1 = pd.MultiIndex.from_tuples([ ('Numbers', 'one'), ('Numbers','two')] )
col_2 = pd.MultiIndex.from_tuples([ ('Letters', 'A'), ('Letters', 'B'), ('Letters', 'C') ] )
num_data = [[0,1],[2,3]]
num_df = pd.DataFrame(num_data, columns=col_1)
let_data = [['a','b','c'],['d','e','f']]
let_df = pd.DataFrame(let_data, columns=col_2)
tot_df = pd.concat([let_df,num_df], axis=1)

, который дает:

  Letters       Numbers    
        A  B  C     one two
0       a  b  c       0   1
1       d  e  f       2   3

Q1: есть ли лучший способ сделать это?Как я могу определить всю таблицу без concat?Q2: Как извлечь значения из одной строки?Когда я пытаюсь извлечь одну строку, у меня возникают проблемы, особенно когда я печатаю

tot_df.loc[tot_df['Letters','A'] == ['a'] ]

, и это потому, что "tot_df ['Letters', 'A']. Values" возвращает массив = ['a '' d '], а не (что я ожидаю) список [' a ',' d '].

Q3. Переходя теперь к части печати / чтения, я обычно использую методы to_csv () и read_csv (), но я получаю развернутый 1D-заголовок, как показано ниже:

tot_df.to_csv('multi_col.csv')
read_df = pd.read_csv('multi_col.csv', index_col = 0 )
read_df

     Letters Letters.1 Letters.2 Numbers Numbers.1
NaN        A         B         C     one       two
 0.0       a         b         c       0         1
 1.0       d         e         f       2         3

Может ли кто-нибудь из вас предложить лучшее решение?

Спасибо

1 Ответ

0 голосов
/ 19 декабря 2018

Q1: Вы можете объединить список кортежей вместе, а также данные в списке с помощью понимания списка и вызвать только один раз DataFrame конструктор:

col_1 = [('Numbers', 'one'), ('Numbers','two')]
col_2 = [('Letters', 'A'), ('Letters', 'B'), ('Letters', 'C')]
num_data = [[0,1],[2,3]]
let_data = [['a','b','c'],['d','e','f']]

tot_df = pd.DataFrame([a + b for a, b in zip(num_data, let_data)], 
                      columns=pd.MultiIndex.from_tuples(col_1 + col_2))
print (tot_df)
  Numbers     Letters      
      one two       A  B  C
0       0   1       a  b  c
1       2   3       d  e  f

Q2: Для фильтрации по MultiIndex используйте tuples, для сложного выбора используйте слайсеры :

print (tot_df.loc[tot_df[('Letters','A')] == 'a'])
  Numbers     Letters      
      one two       A  B  C
0       0   1       a  b  c

Q3: для записи в файл добавьте параметр index=False для удаления индекса по умолчанию и для чтения добавьте параметр header со списком позицийMultiindex - первые 2 строки файла:

tot_df.to_csv('multi_col.csv', index=False)
read_df = pd.read_csv('multi_col.csv', header= [0,1])
print (read_df)
  Numbers     Letters      
      one two       A  B  C
0       0   1       a  b  c
1       2   3       d  e  f
...