Python:正确构造,写入和读取MultiIndex pd到csv

时间:2018-12-19 13:22:15

标签: python pandas multi-index

我想生成一个具有几列的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()方法,但是我得到了展开的一维标头,如下所示:

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 :(得分:0)

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

第二季度:对于使用MultiIndex进行过滤的用户,请使用tuples;对于复杂的选择,请使用slicers

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-文件的前2行的添加参数Multiindex

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