数据帧交错重排序

2024-04-24 00:38:15 发布

您现在位置:Python中文网/ 问答频道 /正文

抱歉,题目不太好,问题可能更糟。你知道吗

我需要对pandas数据帧执行一个超级简单的操作,但我显然缺少如何调用它,因此无法找到要搜索的正确关键字。你知道吗

给定一个数据帧

   a   b   c
0  0  46  14
1  0   7  14
2  0  46  19
3  0   7  19
4  1  46  14
5  1   7  14
6  1  46  19
7  1   7  19

我需要重新排序行以获得

   a   b   c
0  0  46  14
4  1  46  14
1  0   7  14
5  1   7  14
2  0  46  19
6  1  46  19
3  0   7  19
7  1   7  19

另一个简单的,也许不那么模棱两可的例子。我想从

   a
0  0
1  0
2  1
3  1
4  2
5  2

   a
0  0
2  1
4  2
1  0
3  1
5  2

编辑:对整个图片进行一些澄清

值得一提的是,第一个示例中的数据帧是字典的笛卡尔积

'a': [0, 1], 'b': array([46,  7]), 'c': array([14, 19])}

[{'a': 0, 'b': 46, 'c': 14},
 {'a': 0, 'b': 7, 'c': 14},
 {'a': 0, 'b': 46, 'c': 19},
 {'a': 0, 'b': 7, 'c': 19},
 {'a': 1, 'b': 46, 'c': 14},
 {'a': 1, 'b': 7, 'c': 14},
 {'a': 1, 'b': 46, 'c': 19},
 {'a': 1, 'b': 7, 'c': 19}]

我需要对它进行排序,以便为每个参数组合将所有a值分组并循环在一起。你知道吗


Tags: 数据编辑示例pandas参数字典排序图片
2条回答

如果要进行排序,使看到值的第0次都排在第一位,然后是第1次,依此类推,可以按感兴趣的列进行分组,并对累计计数进行排序:

In [119]: df.loc[df.groupby("a").cumcount().sort_values(kind='mergesort').index]
Out[119]: 
   a
0  0
2  1
4  2
1  0
3  1
5  2

这是因为

In [120]: df.groupby("a").cumcount()
Out[120]: 
0    0
1    1
2    0
3    1
4    0
5    1
dtype: int64

In [121]: df.groupby("a").cumcount().sort_values(kind='mergesort')
Out[121]: 
0    0
2    0
4    0
1    1
3    1
5    1
dtype: int64

请注意,我们使用kind='mergesort'来保证稳定性,如果需要,您可以先对原始帧排序,如果您想打开[1, 2, 2, 0, 0, 1]->;[0, 0, 1, 1, 2, 2]->;[0, 1, 2, 0, 1, 2]。你知道吗

通过在开始时创建不同的DataFrame,可以跳过所有的重新排序。您可以使用np.tilenp.repeat的组合,而不是仅仅使用itertools.product。你知道吗

import pandas as pd
import numpy as np

a = [0, 1] 
b = np.array([46, 7])
c = np.array([14, 19])

d = list(zip(np.tile(a, len(b)*len(c)), 
             np.tile(np.repeat(b, len(a)), len(c)), 
             np.repeat(c, len(a)*len(b))))

pd.DataFrame(d, columns=['a', 'b', 'c'])
#   a   b   c
#0  0  46  14
#1  1  46  14
#2  0   7  14
#3  1   7  14
#4  0  46  19
#5  1  46  19
#6  0   7  19
#7  1   7  19

相关问题 更多 >