在Pandas中交织组

dldeef67  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(93)

我有一个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 |
有什么想法吗?

bqjvbblv

bqjvbblv1#

您可以使用每个Groupcumcount作为排序键:

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

ekqde3dh

ekqde3dh2#

解决方案1

另一种可能的方法是按组计算元素的数量n,然后通过以方便的顺序(顺序F)重新整形和平整三角形的索引,获得正确的索引以重新索引(使用iloc)并获得想要的输出:

n = len(df) // df['Group'].nunique()
df.iloc[df.index.values.reshape(-1, n).flatten(order='F')]

字符串

解决方案2

还有一种可能的解决方案,它基于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

相关问题