python - 如何比较数据并从 pandas 的 multiIndex 数据框中选择 TOP 2?
问题描述
如何比较数据并从 pandas 的 multiIndex 数据框中选择 TOP 2 或 TOP5?你在这个例子中看到,如果foo
只得到一条记录,它将只选择一条。但如果有 3 条记录,则会选择 TOP2 记录。
例如:
arrays = [np.array(['bar', 'bar', 'bar', 'bar', 'baz','baz', 'baz', 'qux', 'qux','qux', 'qux','foo']),
np.array(['AA', 'AB', 'AC','AD', 'BA', 'BB', 'BC', 'CA', 'CB', 'CC', 'CD', 'DA'])]
df = pd.DataFrame(np.random.randn(12, 1), index=arrays)
df
出去:
0
bar AA -0.754077
AB 0.924327
AC 0.146192
AD -0.718730
baz BA -0.143378
BB 1.098409
BC 0.703452
qux CA 0.729626
CB 0.232755
CC 0.827796
CD 0.914639
foo DA -0.289108
最后,我想这样选择:
0
bar AB 0.924327
AC 0.146192
baz BB 1.098409
BC 0.703452
qux CC 0.827796
CD 0.914639
foo DA -0.289108
解决方案
利用:
np.random.seed(234)
arrays = [np.array(['bar', 'bar', 'bar', 'bar', 'baz','baz', 'baz', 'qux', 'qux','qux', 'qux','foo']),
np.array(['AA', 'AB', 'AC','AD', 'BA', 'BB', 'BC', 'CA', 'CB', 'CC', 'CD', 'DA'])]
df = pd.DataFrame(np.random.randn(12, 1), index=arrays)
print (df)
0
bar AA 0.818792
AB -1.043551
AC 0.350901
AD 0.921578
baz BA -0.087382
BB -3.128885
BC -0.969733
qux CA 0.934666
CB 0.043866
CC 1.425216
CD -0.557063
foo DA 0.926824
s = df.groupby(level=0)[0].nlargest(2).reset_index(level=0, drop=True)
print (s)
bar AD 0.921578
AA 0.818792
baz BA -0.087382
BC -0.969733
foo DA 0.926824
qux CC 1.425216
CA 0.934666
Name: 0, dtype: float64
如果需要避免排序MultiIndex
:
df1 = (df.groupby(level=0, sort=False)[0]
.nlargest(2)
.reset_index(level=0, drop=True)
.to_frame())
print (df1)
0
bar AD 0.921578
AA 0.818792
baz BA -0.087382
BC -0.969733
qux CC 1.425216
CA 0.934666
foo DA 0.926824
另一种解决方案,在pandas 0.23.0+中使用sort_values
and GroupBy.head
:
df.index.names = ['lvl1','lvl2']
df.columns = ['a']
s = df.sort_values(['lvl1', 'a'], ascending=[True, False]).groupby(level=0).head(2)
print (s)
a
lvl1 lvl2
bar AD 0.921578
AA 0.818792
baz BA -0.087382
BC -0.969733
foo DA 0.926824
qux CC 1.425216
CA 0.934666
推荐阅读
- sql - 从字符串中删除前导破折号
- android - 尝试在 Android JSON 中的空对象引用上调用虚拟方法“int java.lang.String.length()”
- html - JavaScript 提交表单未正确传递隐藏值
- postman - Postman pre-request script iterate over request body JSON
- javascript - 找到最小的 - Codewars 挑战 - Javascript
- css - 为什么按钮元素不受 CSS 影响?
- android - BindingAdapter 中带有对象属性枚举的问题
- javascript - 如何在本机反应中隐藏特定屏幕上的底部导航栏?
- javascript - 在没有模块加载器的情况下在 TypeScript 中使用 ES2015 模块
- r - 如何获取R中数据框中所有变量的唯一值的计数