我有一个多索引的DataFrame
,其名称附加到列级别。我希望能够轻松地对列进行无序排列,以便它们与用户指定的顺序相匹配。由于这是管道,我无法使用此推荐的解决方案,并在创建时正确订购它们。
我有一个数据表,看起来像
Experiment BASE IWWGCW IWWGDW
Lead Time 24 48 24 48 24 48
2010-11-27 12:00:00 0.997 0.991 0.998 0.990 0.998 0.990
2010-11-28 12:00:00 0.998 0.987 0.997 0.990 0.997 0.990
2010-11-29 12:00:00 0.997 0.992 0.997 0.992 0.997 0.992
2010-11-30 12:00:00 0.997 0.987 0.997 0.987 0.997 0.987
2010-12-01 12:00:00 0.996 0.986 0.996 0.986 0.996 0.986
我想采取这样的列表['IWWGCW','IWWGDW','BASE']
并重新排序:
Experiment IWWGCW IWWGDW BASE
Lead Time 24 48 24 48 24 48
2010-11-27 12:00:00 0.998 0.990 0.998 0.990 0.997 0.991
2010-11-28 12:00:00 0.997 0.990 0.997 0.990 0.998 0.987
2010-11-29 12:00:00 0.997 0.992 0.997 0.992 0.997 0.992
2010-11-30 12:00:00 0.997 0.987 0.997 0.987 0.997 0.987
2010-12-01 12:00:00 0.996 0.986 0.996 0.986 0.996 0.986
附带一个警告,我并不总是知道“实验”会是什么水平。我试过(其中df
是上图的多索引框架)
df2 = df.reindex_axis(['IWWGCW', 'IWWGDW', 'BASE'], axis=1, level='Experiment')
但是这似乎不起作用——它成功地完成了,但是返回的数据帧的列顺序没有改变。
我的解决方法是具有如下功能:
def reorder_columns(frame, column_name, new_order):
"""Shuffle the specified columns of the frame to match new_order."""
index_level = frame.columns.names.index(column_name)
new_position = lambda t: new_order.index(t[index_level])
new_index = sorted(frame.columns, key=new_position)
new_frame = frame.reindex_axis(new_index, axis=1)
return new_frame
其中,reorder_列(df,'Experiment',['iwgcw','iwgdw','BASE'])
做了我期望的事情,但感觉我在做额外的工作。有没有更简单的方法?
我不知道有什么现成的。创建了一个关于它的增强票据:
http://github.com/pydata/pandas/issues/1864
这是对我最简单的一个:
>
对于所选级别,按所需顺序创建列列表;
重新为列编制索引并从该列表创建一个多索引对象,记住这将返回一个元组;
使用多索引对象对数据帧重新排序。
cols = ['IWWGCW', 'IWWGDW', 'BASE']
new_cols = df.columns.reindex(cols, level=0)
df.reindex(columns=new_cols[0]) #new_cols is a single item tuple
在一行中:
df.reindex(columns=df.columns.reindex(['IWWGCW', 'IWWGDW', 'BASE'], level=0)[0])
瞧
有一个非常简单的方法:只需根据原始数据框创建一个新的数据框,多索引列的顺序正确:
multi_tuples = [('IWWGCW',24), ('IWWGCW',48), ('IWWGDW',24), ('IWWGDW',48)
, ('BASE',24), ('BASE',48)]
multi_cols = pd.MultiIndex.from_tuples(multi_tuples, names=['Experiment', 'Lead Time'])
df_ordered_multi_cols = pd.DataFrame(df_ori, columns=multi_cols)
问题内容: 从这里开始。该解决方案仅适用于一列。如何改进多列解决方案。即如果我有一个像 如何重塑像 如果df是 然后 问题答案: 采用 要么, 另外,索引不相等
问题内容: 我有一个看起来像这样的数据框: 它是使用以下代码创建的: 我要做的是根据预定义的列表对行(带有索引)进行排序。结果是: 我该如何实现? 问题答案: 你可以使用预定义的顺序设置指标像 但是,如果按字母顺序排列,则可以使用 如下所示,您需要将其分配给一些变量
问题内容: 我有一个数据框,具有以下的multiindex列: 如何将列索引级别展平/合并为:“ Level1 | Level2”,例如,。等等?如果这不可能,是否有办法像我上面所做的那样不创建多索引列? 问题答案: 您可以随时更改列:
在python中是否可以按给定的索引重新排序列表? 如果我有列表: 我想按第二个索引重新排序,使其具有如下内容:
问题内容: 我有一个带有两列“标识符”,“值”和“子标识”的以下数据框 df : 我有一个索引列表,例如 我想在列表x中提到的索引之前插入行。就像,对于在索引2之前插入的行,将具有以下值,它将具有 与 在索引2处的行 相同的标识符 ,即1; 与 索引2的行 相同的值 ,即103;但是新行中的 subid 将是((索引2处的subid)-1),或者仅仅是前一行的subid,即1。 以下是我期望的最终
它在错误下面抛出: 提示我,如何删除ElasticSearch中特定类型索引中的多个或所有文档。