在熊猫中加载CSV时,您可以轻松地指定用作列索引的行数,例如:
import pandas
from six import StringIO
df = """a | X | X | Y | Y | Z | Z
b | C | N | C | N | C | N
c | i | i | i | j | j | j
d | 3 | 10 | 4 | 98 | 81 | 0"""
df = StringIO(df.replace(' ',''))
df = pandas.read_csv(df, sep="|", header=[0,1,2])
>>> df
a X Y Z
b C N C N C N
c i i i j j j
0 d 3 10 4 98 81 0
但是如何从内存中的数据帧产生相同的结果?您如何简单地指定应为列索引使用哪组行?
当然不会经历此hack:
>>> df
0 1 2 3 4 5 6
0 a X X Y Y Z Z
1 b C N C N C N
2 c i i i j j j
3 d 3 10 4 98 81 0
path = '~/test/temp.csv'
df.to_csv(path, header=None, index=None)
df = pandas.read_csv(path, header=[0,1,2])
甚至是这种骇客:
>>> df
0 1 2 3 4 5 6
0 a X X Y Y Z Z
1 b C N C N C N
2 c i i i j j j
3 d 3 10 4 98 81 0
df = df.transpose().set_index([0,1,2]).transpose()
我尝试使用此方法,但它不接受axis
参数:
df.set_index(['a', 'b', 'c'], axis=1)
答案 0 :(得分:2)
您的替代解决方案应有所改进:
df = df.T.set_index([0,1,2]).T
另一种无需移调的解决方案:
df.columns = pd.MultiIndex.from_tuples(df.iloc[:3].apply(tuple))
df = df.iloc[3:].reset_index(drop=True)
print (df)
a X Y Z
b C N C N C N
c i i i j j j
0 d 3 10 4 98 81 0