我有一个通过读取各种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'])
答案 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]是您的值列。