大熊猫.sortlevel不能排序负数

时间:2016-11-28 21:03:16

标签: python sorting pandas

我有一个通过读取各种CSV文件构建的pandas数据帧。它看起来像这样:

ID                  V2        H1-b          V3          H2          V1        H1a
position         -50.0       600.0      -125.0      -720.0        23.0      450.0
2000-01-01   -1.057609    1.160002    1.082879   -1.304001   -0.259283   1.285260  
2000-02-01   -1.133474   -0.385869    0.756780    2.311465    1.060337  -1.059041  
2000-03-01    1.209086   -0.774133    0.018603    0.969665   -1.221080   1.717816  
...

当我尝试使用df_sort = df.sortlevel(level=1,axis=1)(或sortlevel='position',相同的结果)对其进行排序时,我得到以下结果:

ID                  V3          V2          H2          V1        H1-a     H1-b 
position        -125.0       -50.0      -720.0        23.0       450.0    600.0 
2000-01-01    1.082879   -1.057609   -1.304001   -0.259283    1.285260    1.160002 
2000-02-01    0.756780   -1.133474    2.311465    1.060337   -1.059041   -0.385869 
2000-03-01    0.018603    1.209086    0.969665   -1.221080    1.717816   -0.774133  

正数以正确方式排序(23 <450 <600),但负数是&#34;随机&#34;。

据我所知,我的所有CSV文件都是相同的(数字或类似之前没有空格),数据框中的所有条目都是由同一个脚本生成的。

但是当我试图用简单的合成数据帧来重现它时,排序有效:

header=pd.MultiIndex.from_product([[-3,-300,4,100,34,-324],['s']],names=['loc','X'])
df = pd.DataFrame(np.random.randn(5, 6), index=['a','b','c','d','e'], columns = header)

结果

In [6]: df.head()
Out[6]: 
loc      -3        -300       4         100       34       -324
S           s         s         s         s         s         s
a   -0.444521 -0.616153  2.261075 -1.857406  0.367582  1.212705
b   -1.389062 -0.741163  0.512457  1.013495 -2.003147  0.651232
c   -0.376925 -0.271408 -0.854247  0.355438 -0.791896 -1.359056
d   -2.929450  0.228446  1.287110 -1.117579 -0.501250  1.340859
e   -0.653089  0.245901  0.036066  0.776839 -1.112828 -0.476782

In [9]: df_sort = df.sortlevel('loc',axis=1)

In [10]: df_sort.head()
Out[10]: 
loc      -324      -300      -3         4         34        100
S           s         s         s         s         s         s
a    1.212705 -0.616153 -0.444521  2.261075  0.367582 -1.857406
b    0.651232 -0.741163 -1.389062  0.512457 -2.003147  1.013495
c   -1.359056 -0.271408 -0.376925 -0.854247 -0.791896  0.355438
d    1.340859  0.228446 -2.929450  1.287110 -0.501250 -1.117579
e   -0.476782  0.245901 -0.653089  0.036066 -1.112828  0.776839

sortlevel(level = 0

一样

首先想法是我的索引中的其他内容会影响排序,但df_sort = df_GW.sortlevel(level='location',axis=1,sort_remaining=False)不会改变排序中的任何内容。

我做错了什么?

我怀疑无论出于何种原因,某些东西被视为字符串或其他东西,但我无法找到任何迹象。

修改 df.dtypes的输出: 真实的df:

In [29]: df_GW.dtypes
Out[29]: 
ID     Position  
V2     -50.0     float64
H1-b   600.0     float64
V3     -125.0    float64
H2     -720.0    float64
V1     23.0      float64
H1-a   450.0     float64
dtype: object

合成

AttributeError: 'DataFrame' object has no attribute 'dtype'

df.columns 实:

 MultiIndex(levels=[[u'H1-a', u'H1-b', u'H2', u'V1', u'V2', u'V3'], [u'-125.0', u'-50.0', u'-720.0', u'23.0', u'450.0', u'600.0']],
       labels=[[4, 1, 5, 2, 3, 0], [1, 5, 0, 2, 3, 4], [4, 1, 5, 2, 3, 0], [0, 0, 0, 0, 0, 0]], #not sure what's happening here. The original df is a bit bigger, and I'm cutting it to size
       names=[u'ID', u'position'])

合成

 MultiIndex(levels=[[-720.0, -125.0, -50.0, 23.0, 450.0, 600.0], [u's']],
       labels=[[2, 5, 1, 0, 3, 4], [0, 0, 0, 0, 0, 0]],
       names=[u'loc', u'S'])

2 个答案:

答案 0 :(得分:2)

我认为第一级MultiIndex中的数字类型不是float,而是string

np.random.seed(0)
header=pd.MultiIndex.from_product([['-125','-50','4','100','34','-720'],
                                   ['s']],names=['loc','X'])
df = pd.DataFrame(np.random.randn(5, 6), index=['a','b','c','d','e'], columns = header)
print (df)
loc      -125       -50         4       100        34      -720
X           s         s         s         s         s         s
a    1.764052  0.400157  0.978738  2.240893  1.867558 -0.977278
b    0.950088 -0.151357 -0.103219  0.410599  0.144044  1.454274
c    0.761038  0.121675  0.443863  0.333674  1.494079 -0.205158
d    0.313068 -0.854096 -2.552990  0.653619  0.864436 -0.742165
e    2.269755 -1.454366  0.045759 -0.187184  1.532779  1.469359

df.sortlevel('loc',axis=1, inplace=True)
print (df)
loc      -125       -50      -720       100        34         4
X           s         s         s         s         s         s
a    1.764052  0.400157 -0.977278  2.240893  1.867558  0.978738
b    0.950088 -0.151357  1.454274  0.410599  0.144044 -0.103219
c    0.761038  0.121675 -0.205158  0.333674  1.494079  0.443863
d    0.313068 -0.854096 -0.742165  0.653619  0.864436 -2.552990
e    2.269755 -1.454366  1.469359 -0.187184  1.532779  0.045759

如果需要将string级别转换为float,则需要更改值并分配给新的列名:

#change multiindex
cols = list(zip(df.columns.get_level_values('loc').astype(float),
                df.columns.get_level_values('X')))
df.columns = pd.MultiIndex.from_tuples(cols, names = df.columns.names)


df.sortlevel('loc',axis=1, inplace=True)
print (df)
loc      -720      -125      -50        4         34        100
X           s         s         s         s         s         s
a   -0.977278  1.764052  0.400157  0.978738  1.867558  2.240893
b    1.454274  0.950088 -0.151357 -0.103219  0.144044  0.410599
c   -0.205158  0.761038  0.121675  0.443863  1.494079  0.333674
d   -0.742165  0.313068 -0.854096 -2.552990  0.864436  0.653619
e    1.469359  2.269755 -1.454366  0.045759  1.532779 -0.187184

答案 1 :(得分:0)

尝试df.sort_values(by=[1], axis=0, ascending=True),其中[1]是您的值列。