如何根据列中的数字复制Pandas中的行组?

2024-04-20 12:49:10 发布

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

我有一个熊猫数据帧(df),看起来像这样:

+-----------------------------  +
| aid | bid | x1  | x2  | count |
+-----------------------------  +
| 1   | 1   | tim | 6   | 3     |
| 1   | 2   | tim | 6   | 3     |
| 1   | 3   | tim | 6   | 3     |
| 2   | 1   | bob | 6   | 2     |
| 2   | 2   | bob | 6   | 2     |
| 2   | 3   | bob | 6   | 2     |
+-----------------------------  +

我需要生成一个新的数据帧,其中每个组(分组在“aid”上)由“count”列中的数字复制。应该是这样的:

+-----------------------------  +
| aid | bid | x1  | x2  | count |
+-----------------------------  +
| 1   | 1   | tim | 6   | 3     |
| 1   | 2   | tim | 6   | 3     |
| 1   | 3   | tim | 6   | 3     |
| 1   | 1   | tim | 6   | 3     |
| 1   | 2   | tim | 6   | 3     |
| 1   | 3   | tim | 6   | 3     |
| 1   | 1   | tim | 6   | 3     |
| 1   | 2   | tim | 6   | 3     |
| 1   | 3   | tim | 6   | 3     |
| 2   | 1   | bob | 6   | 2     |
| 2   | 2   | bob | 6   | 2     |
| 2   | 3   | bob | 6   | 2     |
| 2   | 1   | bob | 6   | 2     |
| 2   | 2   | bob | 6   | 2     |
| 2   | 3   | bob | 6   | 2     |
+-----------------------------  +

我似乎无法使用熊猫中的split-apply-combine方法来实现这一点。你知道吗

我能把小组分开 数据框groupby('aid',sort=False) 但不能越过这一步。 谢谢你的帮助。你知道吗

更新:B.M.和Alexander的答案都与我提供的示例数据一致。我后来了解到,我提供的数据是不够现实的工作与我的真实数据。让我提供一个更新的数据集。你知道吗

df = pd.DataFrame({'aid': [1,1,1,2,2,2], 'bid': [1,2,3,1,2,3], 'x1':    ['tim']*3 + ['bob']*3 + ['ray']*3, 'x2': [1,0,0,0,1,0,0,0,1], 'count': [3,3,3,2,2,2,4,4,4]})[['aid', 'bid', 'x1', 'x2', 'count']]

    aid  bid  x1    x2     count
0    1    1   tim   1      3
1    1    2   tim   0      3
2    1    3   tim   0      3
3    2    1   bob   0      2
4    2    2   bob   1      2
5    2    3   bob   0      2
6    3    1   ray   0      4
7    3    2   ray   0      4
8    3    3   ray   1      4

现在,当我运行Alexander的解决方案时,我得到如下所示的输出。我需要先将输出按“aid”排序,然后按“bid”排序,其中bid始终重复1、2、3,同时在复制三行的组之前,将与该“bid”关联的X2值保留在原始数据中。你知道吗

pd.concat([frame 
           for count, frame in df.groupby('count', as_index=False,sort=False) 
           for _ in range(count)]).sort_values('aid').reset_index(drop=True)

    aid  bid   x1   x2     count
0     1    1  tim   1      3
1     1    2  tim   0      3
2     1    3  tim   0      3
3     1    1  tim   1      3
4     1    2  tim   0      3
5     1    3  tim   0      3
6     1    1  tim   1      3
7     1    2  tim   0      3
8     1    3  tim   0      3
9     2    3  bob   0      2
10    2    1  bob   0      2
11    2    2  bob   1      2
12    2    2  bob   1      2
13    2    1  bob   0      2
14    2    3  bob   0      2
15    3    2  ray   0      4
16    3    1  ray   0      4
17    3    2  ray   0      4
18    3    3  ray   1      4
19    3    1  ray   0      4
20    3    2  ray   0      4
21    3    3  ray   1      4
22    3    1  ray   0      4
23    3    2  ray   0      4
24    3    3  ray   1      4
25    3    1  ray   0      4
26    3    3  ray   1      4

在这个输出中,它对第一个“bid”观察值(即1,2,3,1,2,3…)进行了正确排序,但随后排序进一步下降。一定有我错过的小调整。我真的很感激你对这件事有进一步的想法。你知道吗

使用B.M.提供的示例,它提供了按重复“bid”(即1,2,3,1,2,3…)排序的正确答案,但按“aid”排序时,答案将丢失。你知道吗

谢谢你对如何解决这个问题的任何建议。你知道吗


Tags: 数据答案falsedf排序countsortbob
2条回答
out=pd.DataFrame()
for n,fr in df.groupby('count'): out=out.append([fr]*n)

为了

In [5]: out.sort('aid')
Out[5]: 
   aid  bid   x1  x2  count
0    1    1  tim   6      3
1    1    2  tim   6      3
2    1    3  tim   6      3
0    1    1  tim   6      3
1    1    2  tim   6      3
2    1    3  tim   6      3
0    1    1  tim   6      3
1    1    2  tim   6      3
2    1    3  tim   6      3
3    2    1  bob   6      2
4    2    2  bob   6      2
5    2    3  bob   6      2
3    2    1  bob   6      2
4    2    2  bob   6      2
5    2    3  bob   6      2

可以使用列表连接:

df = pd.DataFrame({'aid': [1,1,1,2,2,2], 'bid': [1,2,3,1,2,3], 'x1': ['tim']*3 + ['bob']*3, 'x2': [6]*6, 'count': [3,3,3,2,2,2]})[['aid', 'bid', 'x1', 'x2', 'count']]

>>> pd.concat([frame 
               for count, frame in df.groupby('count', as_index=False, sort=False) 
               for _ in range(count)]).sort_values('aid').reset_index(drop=True)
    aid  bid   x1  x2  count
0     1    1  tim   6      3
1     1    2  tim   6      3
2     1    3  tim   6      3
3     1    1  tim   6      3
4     1    2  tim   6      3
5     1    3  tim   6      3
6     1    1  tim   6      3
7     1    2  tim   6      3
8     1    3  tim   6      3
9     2    1  bob   6      2
10    2    2  bob   6      2
11    2    3  bob   6      2
12    2    1  bob   6      2
13    2    2  bob   6      2
14    2    3  bob   6      2

相关问题 更多 >