我有以下数据:
Set Coolthing Route Organ Up Down
set4 Pam3CSK4 ID LL 81 60
set4 Poly_IC ID LL 542 92
set4 Poly_IC ID MM 73 73
set4 cdiGMP ID MM 143 78
set4 Poly_IC ID BB 32 82
set4 cdiGMP ID BB 90 129
使用以下代码:
import pandas as pd
df = pd.io.parsers.read_table("http://dpaste.com/2PHS7R0.txt",sep=" ")
df = df.pivot(index="Coolthing",columns="Organ").fillna(0)
df.drop('Set',axis=1,inplace=True)
df.drop('Route',axis=1,inplace=True)
df.index.name = None
df.columns.names = (None,None)
我得到以下内容:
In [75]: df
Out[75]:
Up Down
BB LL MM BB LL MM
Pam3CSK4 0 81 0 0 60 0
Poly_IC 32 542 73 82 92 73
cdiGMP 90 0 143 129 0 78
我想要做的是以不区分大小写的方式对行进行排序 产生这个:
Up Down
BB LL MM BB LL MM
cdiGMP 90 0 143 129 0 78
Pam3CSK4 0 81 0 0 60 0
Poly_IC 32 542 73 82 92 73
我怎样才能做到这一点?
答案 0 :(得分:5)
在@Marius case_insensitive_order
的基础上,使用reindex
In [63]: df.reindex(sorted(df.index, key=lambda x: x.lower()))
Out[63]:
Up Down
BB LL MM BB LL MM
cdiGMP 90 0 143 129 0 78
Pam3CSK4 0 81 0 0 60 0
Poly_IC 32 542 73 82 92 73
答案 1 :(得分:2)
您可以使用新的CategoricalIndex
(我认为是0.16.1中的新内容)强制执行此操作,但我不确定它是否是一个好主意,因为它可能具有不可预测的效果:
case_insenstive_order = sorted(df.index, key=lambda x: x.lower())
case_insenstive_order
Out[4]: ['cdiGMP', 'Pam3CSK4', 'Poly_IC']
df.index = pd.CategoricalIndex(df.index,
categories=case_insenstive_order,
ordered=True)
df.sort_index()
Out[7]:
Up Down
BB LL MM BB LL MM
cdiGMP 90 0 143 129 0 78
Pam3CSK4 0 81 0 0 60 0
Poly_IC 32 542 73 82 92 73
答案 2 :(得分:1)
我认为这也是一个有效的答案:
: COLOR
然而,df = df.iloc[df.index.str.lower().argsort()]
肯定会更快一些:
reindex
我在这里用pandas 0.20.3和python2测试了一个有500行和大约50列的表。