当前位置: 首页 > 面试题库 >

如何在由一列定义的分区中进行排序,但如何将分区保留在原位置?

贺宝
2023-03-14
问题内容

考虑数据框 df

df = pd.DataFrame(dict(
        A=list('XXYYXXYY'),
        B=range(8, 0, -1)
    ))

print(df)

   A  B
0  X  8
1  X  7
2  Y  6
3  Y  5
4  X  4
5  X  3
6  Y  2
7  Y  1

使用'X'按列定义的组'A',我想[8, 7, 4, 3]按预期进行排序[3, 4, 7, 8]。但是,我想将这些行保留在原处。

   A  B
5  X  3  <-- Notice all X are in same positions
4  X  4  <-- However, `[3, 4, 7, 8]` have shifted
7  Y  1
6  Y  2
1  X  7  <-- 
0  X  8  <-- 
3  Y  5
2  Y  6

问题答案:

您可以transform用来取回新的所需索引顺序,然后用于reindex重新排列DataFrame:

# Use transform to return the new ordered index values.
new_idx = df.groupby('A')['B'].transform(lambda grp: grp.sort_values().index)

# Reindex.
df = df.reindex(new_idx.rename(None))

如果需要,可以将上面的两行合并为一条长行。

结果输出:

   A  B
5  X  3
4  X  4
7  Y  1
6  Y  2
1  X  7
0  X  8
3  Y  5
2  Y  6

请注意,如果您不关心维护旧索引,则可以直接从中重新分配transform

df['B'] = df.groupby('A')['B'].transform(lambda grp: grp.sort_values())

产生:

   A  B
0  X  3
1  X  4
2  Y  1
3  Y  2
4  X  7
5  X  8
6  Y  5
7  Y  6


 类似资料:
  • Hadoop MapReduce的默认行为是在分区内对schffle键进行排序,但不是跨分区(它是使键跨部分排序的总排序) 我想问如何使用Spark RDD实现同样的事情(分区内排序,但不跨分区排序) < li>RDD的< code>sortByKey方法是进行总排序 < li>RDD的< code > repartitionandsorttwithinpartitions 在分区内进行排序,而不

  • 问题内容: 我有一个需要在JavaScript中排序的字符串数组,但不区分大小写。如何执行呢? 问题答案: 在(几乎:)单线 导致 而 结果是

  • 问题内容: 在AngularJS部分中,我如下遍历条目列表: 的内容有一些换行符,AngularJS会忽略它们。如何使其保留换行符? 问题答案: 这只是基本的HTML。AngularJS对此不会做任何改变。您可以改用标签: 或使用CSS: 如果包含HTML代码,则可以使用: 不要忘记包括ngSanitize:

  • 我需要从一个Hive表中读取数据并将其插入到另一个Hive表中。两个表的架构是相同的。该表按日期分区 步骤1:从Spark的源表中读取数据。 第 2 步:按列(国家、日期)和分区数重新分区为 4。 我只得到每个国家代码1个分区

  • 问题内容: 给定一个记录某些书籍使用情况的数据框,如下所示: 我需要获取所有书籍的数量,保留其他列并获取以下内容: 如何才能做到这一点? 谢谢! 问题答案: 您需要以下内容: 在您的情况下,“名称”,“类型”和“ ID”列的值匹配,因此我们可以对它们进行调用,然后单击。 另一种方法是使用添加“ Count”列,然后调用: