假设我有一个类似以下的MultiIndex DataFrame:
X Y
A B
bar one 0.717822 -0.421127
three -0.763407 -0.306909
flux six -1.504799 0.977983
three -0.202268 1.971939
foo five 1.715336 -0.157881
one 0.942614 -1.529973
two -1.918896 -0.989882
two 0.434202 1.438424
我想创建一个新列new
,以便A
的每个值的 ,B
条目的一半,列new
为H
,而另一半为new
为L
。
我正在寻找一个答案,使无假设关于索引中各级别的位置(即解决方案应按名称引用级别)。
在上面的示例中,一个可能的分配如下所示:
X Y new
A B
bar one 0.717822 -0.421127 H
three -0.763407 -0.306909 L
flux six -1.504799 0.977983 H
three -0.202268 1.971939 L
foo five 1.715336 -0.157881 H
one 0.942614 -1.529973 H
two -1.918896 -0.989882 L
two 0.434202 1.438424 L
我怎么能在熊猫中做到这一点?
答案 0 :(得分:2)
我首先创建了一个系列,其中每个组中的相对累积计数(在A级上分组),然后将“H”/“L”分配给低于/高于0.5的值:
In [118]: s = df.groupby(level='A').cumcount() / df.groupby(level='A').size()
In [119]: df['new'] = 'H'
In [120]: df.loc[s>=0.5, 'new'] = 'L'
更新:该分区似乎不适用于pandas 0.13.1(但与master / 0.14一起使用)。相反,您可以使用div
方法并明确指定级别:
s = df.groupby(level='A').cumcount().div(df.groupby(level='A').size(), level='A')