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

时间:2016-04-09 00:24:49

标签: python pandas

我有一个像这样的pandas数据框(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 | 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     |
+-----------------------------  +

我似乎无法使用pandas中的split-apply-combine方法来实现此功能。

我能够分组     df.groupby(' aid',sort = False) 但无法超越这一步。 谢谢你的帮助。

更新:B.M.的答案。和亚历山大一起使用我提供的示例数据。我后来了解到,我提供的数据不够真实,无法使用我的真实数据。让我提供一个更新的数据集。

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

现在,当我运行亚历山大的解决方案时,我得到如下所示的输出。我需要先按照'援助'排序。然后出价'其中,出价总是重复1,2,3,同时保持与该出价相关联的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.提供的示例。它提供了正确的答案,按重复的出价排序' (即1,2,3,1,2,3 ......)但是当按照'援助排序时会丢失。

感谢您就如何解决此问题提出任何建议。

1 个答案:

答案 0 :(得分:0)

您可以使用列表推导进行连接:

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