如何在 Pandas 数据框中对行的子集进行排序

6
我有以下数据框:
import pandas as pd
df = pd.DataFrame({'FavCol' : ['Fixy','Macky', 'querk', 'alber'],
                   'sample1' : [20.3, 25.3,3.1,3],
                   'sample2' : [130, 150,173,4],        
                   'sample3' : [1.0, 2.0,12.0,4],         
                   })

这看起来像这样:
In [12]: df
Out[12]:
  FavCol  sample1  sample2  sample3
0   Fixy     20.3      130        1
1  Macky     25.3      150        2
2  querk      3.1      173       12
3  alber      3.0        4        4

我想做的是根据“FavCol”对数据框进行(不区分大小写的)排序,但保持第一行“Fixy”的完整性。结果如下:
  FavCol  sample1  sample2  sample3
    Fixy     20.3      130        1
   alber      3.0        4        4
   Macky     25.3      150        2
   querk      3.1      173       12

我该如何实现这个目标?
更新:
我无法复制 [用户:John Galt] 的问题。 以下是数据:
Group No.   Abbr. of test substance Route   Time (hrs)  Dose (/body)    Conc.   Volume of dosage (/body)    # of mouse
1   PBS DMSO5%  i.d.    6   0 mg    0 mg/ mL    0.1 mL  3
2   MPLA    i.d.    6   0.01 mg 0.1 mg/ mL  0.1 mL  3
3   MALP2s  i.d.    6   0.01 mg 0.1 mg/ mL  0.1 mL  3
4   R848    i.d.    6   0.1 mg  1 mg/ mL    0.1 mL  3
5   DMXAA   i.d.    6   0.1 mg  1 mg/ mL    0.1 mL  3

这段代码:
import pandas as pd
df = pd.read_table("http://dpaste.com/0JPC984.txt")
colnames = df.columns.values.tolist()
print colnames
fixed_rown = colnames[1]
df['lower'] = df[fixed_rown].str.lower()
df.loc[1:] = df[1:].sort('lower')
df

它会产生这个:
Out[35]:
   Group No. Abbr. of test substance Route  Time (hrs) Dose (/body)  \
0          1              PBS DMSO5%  i.d.           6         0 mg
1          2                    MPLA  i.d.           6      0.01 mg
2          3                  MALP2s  i.d.           6      0.01 mg
3          4                    R848  i.d.           6       0.1 mg
4          5                   DMXAA  i.d.           6       0.1 mg

        Conc. Volume of dosage (/body)  # of mouse       lower
0    0 mg/ mL                   0.1 mL           3  pbs dmso5%
1  0.1 mg/ mL                   0.1 mL           3        mpla
2  0.1 mg/ mL                   0.1 mL           3      malp2s
3    1 mg/ mL                   0.1 mL           3        r848
4    1 mg/ mL                   0.1 mL           3       dmxaa

In [45]: pd.__version__
Out[45]: '0.16.1'

dmxaa在固定的pbs dmso5%后没有出现。

(注:本文中的代码指特殊的计算机语言语句)
1个回答

8

小写字母排序有点棘手。因此,您可以从FavCol创建一个新的lower列。

In [83]: df['lower'] = df['FavCol'].str.lower()

使用.loc添加排序顺序。
In [84]: df.loc[1:] = df[1:].sort('lower').values

In [85]: df
Out[85]:
  FavCol  sample1  sample2  sample3  lower
0   Fixy     20.3      130        1   fixy
1  alber      3.0        4        4  alber
2  Macky     25.3      150        2  macky
3  querk      3.1      173       12  querk

您可以删除lower列,如果您想要的话。

对我来说,dmxaa 确实在固定的 pbs dmso5% 之后。你能再检查一下吗?并且,能否告诉我你的 pd.__version__ 是多少? - Zero
我的版本是“0.16.1”。 - neversaint
有没有其他的方法来做这件事? - neversaint
使用这个 df.iloc[1:] = df.iloc[1:].sort('lower'),我得到了相同的结果,没有排序。你尝试过使用 version 0.16.1 吗? - neversaint
啊,还是没有移动16,使用逗号的df.iloc[1:, ]可以吗? - Zero
1
@neversaint,你需要在0.16.1中明确传递值,例如:df.loc[1:] = df[1:].sort('lower').values,请检查更新的解决方案。 - Zero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接