我有一个像这样的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 ......)但是当按照'援助排序时会丢失。
感谢您就如何解决此问题提出任何建议。
答案 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