我有一个DataFrame,我想“intereaved”行明智的组。例如,这个DataFrame:| 组|评分|| --|--|| 一| 10 || 一| 9 || 一| 8 || B| 7 || B| 6 || B| 5 |期望的结果是抓住A的第一个,B的第一个,然后A的第二个,然后B的第二个,等等。| 组|评分|| --|--|| 一| 10 || B| 7 || 一| 9 || B| 6 || 一| 8 || B| 5 |有什么想法吗?
bqjvbblv1#
您可以使用每个Group的cumcount作为排序键:
Group
cumcount
out = df.sort_values("Group", key=lambda _: df.groupby("Group").cumcount())
字符串或者更好,正如@mozway所建议的那样,您可以使用以下变体之一:
out = df.sort_values(by="Group", key=lambda s: s.groupby(s).cumcount())
out = df.iloc[np.argsort(df.groupby("Group").cumcount())]
输出量:
print(out) Group Score 0 A 10 3 B 7 1 A 9 4 B 6 2 A 8 5 B 5
型
ekqde3dh2#
解决方案1
另一种可能的方法是按组计算元素的数量n,然后通过以方便的顺序(顺序F)重新整形和平整三角形的索引,获得正确的索引以重新索引(使用iloc)并获得想要的输出:
n
F
iloc
n = len(df) // df['Group'].nunique() df.iloc[df.index.values.reshape(-1, n).flatten(order='F')]
字符串
解决方案2
还有一种可能的解决方案,它基于list comprehension。这个解决方案可能不如前一个有效,因为有一个groupby:
list comprehension
groupby
g = df.groupby('Group') df.iloc[[index for y in zip(*[x.index for _, x in g]) for index in y]]
输出
Group Score 0 A 10 3 B 7 1 A 9 4 B 6 2 A 8 5 B 5
2条答案
按热度按时间bqjvbblv1#
您可以使用每个
Group
的cumcount
作为排序键:字符串
或者更好,正如@mozway所建议的那样,您可以使用以下变体之一:
输出量:
型
ekqde3dh2#
解决方案1
另一种可能的方法是按组计算元素的数量
n
,然后通过以方便的顺序(顺序F
)重新整形和平整三角形的索引,获得正确的索引以重新索引(使用iloc
)并获得想要的输出:字符串
解决方案2
还有一种可能的解决方案,它基于
list comprehension
。这个解决方案可能不如前一个有效,因为有一个groupby
:型
输出
型