我想生成一个具有几列的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
任何人都可以提出更好的解决方案吗?
谢谢
答案 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