如何在pandas数据帧中分配分层列名

时间:2014-11-08 20:42:26

标签: python pandas

我的CSV文件在前两行中有我想用作列名的名称,前两列用作行名。所以,文件看起来像这样:

tp,desc,L,L,D,D
,,1,2,3,4
3001, foo, 23.1, 35.3, 52.0, 11.9
3010, bar, 31.l, 25.9, 13.9, 134.8

我能够将前两列设置为索引,但我仍然坚持让前两行被接受为列名

这是我到目前为止的输入声明:

df = pd.read_csv("file.csv", index_col=[tp,desc])

感谢。

2 个答案:

答案 0 :(得分:0)

尝试使用index_col指定“索引”列,并解码您必须能够读取的数据。

from io import StringIO
import pandas as pd

data="tp,desc,L,L,D,D\n,,1,2,3,4\n3001, foo, 23.1, 35.3, 52.0, 11.9\n3010, bar, 31.l, 25.9, 13.9, 134.8"
df= pd.read_csv(StringIO(data.decode('UTF-8')),sep=',', index_col=[0,1])
print df

输出:

               L   L.1     D    D.1
tp   desc                          
NaN  NaN       1   2.0   3.0    4.0
3001  foo   23.1  35.3  52.0   11.9
3010  bar   31.l  25.9  13.9  134.8

尝试读取文件并以这种方式进行转换。有不同的解决方案here。但通常这可以解决问题。

with open('example.csv', 'rb') as f:
    csv = f.read().decode("utf-8")

答案 1 :(得分:0)

可能是你可以尝试:

import pandas as pd

df = pd.read_csv('file.csv', header=None)

# getting names for columns and index:
cnames = zip(df.iloc[0,2:], df.iloc[1,2:])
inames = list(df.iloc[0,:2])    

#drop the rows with column names (for columns and index)
df.drop([0,1],axis=0,inplace=True)
#set the indexes
df.set_index([0,1],inplace=True)
# set the names for columns and indexes
df.columns = pd.MultiIndex.from_tuples(cnames)
df.index.names = inames

结果是:

               L             D        
               1      2      3       4
tp   desc                             
3001  foo   23.1   35.3   52.0    11.9
3010  bar   31.l   25.9   13.9   134.8

我使用了以下文件内容:

tp,desc,L,L,D,D
,,1,2,3,4
3001, foo, 23.1, 35.3, 52.0, 11.9
3010, bar, 31.l, 25.9, 13.9, 134.8