英文:
Repeat per group row pattern n times for each group and save it
问题
Sure, here's the translated code part you provided:
我有一个像这样的pandas数据框:
```python
df = [[1, 'a1 - d1'],
[1, 'b1 - c1'],
[1, 'd1 - c1'],
[1, 'a1 - b1'],
[1, 'b1 - d1'],
[1, 'c1 - a1'],
[2, 'y1 - z1'],
[2, 'x1 - z1'],
[2, 'z1 - x1']]
# 创建pandas DataFrame
df = pd.DataFrame(df, columns=['group_id', 'combinations'])
df
group_id | 组合 |
---|---|
1 | a1 - d1 |
1 | b1 - c1 |
1 | d1 - c1 |
1 | a1 - b1 |
1 | b1 - d1 |
1 | c1 - a1 |
2 | y1 - z1 |
2 | x1 - y1 |
2 | z1 - x1 |
- 每天我想使用每个组(由group_id表示)的1个组合,共n = 30天。我希望代码中有变量n = 30,以便以后如果需要,我可以更改这个数字。
- 有些组可能有超过n = 30个组合,而有些组可能一开始就少于n = 30个组合。
预期输出:
天 | group_id | user_id |
---|---|---|
第1天 | 1 | a1 - d1 |
第2天 | 1 | b1 - c1 |
第3天 | 1 | d1 - c1 |
第4天 | 1 | a1 - b1 |
第5天 | 1 | b1 - d1 |
第6天 | 1 | c1 - a1 |
第7天 | 1 | y1 - z1 |
.. | .. | .. |
第19天 | 1 | a1 - d1 |
第20天 | 1 | b1 - c1 |
第21天 | 1 | d1 - c1 |
第22天 | 1 | a1 - b1 |
第23天 | 1 | b1 - d1 |
第24天 | 1 | c1 - a1 |
第25天 | 1 | y1 - z1 |
第26天 | 1 | x1 - y1 |
第27天 | 1 | z1 - x1 |
第28天 | 1 | a1 - d1 |
第29天 | 1 | b1 - c1 |
第30天 | 1 | d1 - c1 |
第1天 | 2 | .. |
一个简单的方式
```python
pd.concat([x]*2)
会将整个数据框重复n次,这不是我期望的输出。是否有一种方法可以重复这种模式?
更新到目前为止我尝试过的代码。
基本上,查询每个组并重复该组的序列,然后以某种方式将它们全部合并在一起。可能是最低效的解决方案。但我不确定还有什么其他方法可以做到这一点...
```python
group_list = set(df['group_id'])
for i in group_list:
df1 = df.query(f'group_id == {i}')
# 假设最坏情况是一个组只包含1个组合
df1 = pd.concat([df1]*30)
df1 = df1.head(30)
英文:
I have a pandas dataframe like this:
df = [[1, 'a1 - d1'],
[1, 'b1 - c1'],
[1, 'd1 - c1'],
[1, 'a1 - b1'],
[1, 'b1 - d1'],
[1, 'c1 - a1'],
[2, 'y1 - z1'],
[2, 'x1 - z1'],
[2, 'z1 - x1']]
# Create the pandas DataFrame
df = pd.DataFrame(df, columns=['group_id', 'combinations'])
df
group_id | Combinations |
---|---|
1 | a1 - d1 |
1 | b1 - c1 |
1 | d1 - c1 |
1 | a1 - b1 |
1 | b1 - d1 |
1 | c1 - a1 |
2 | y1 - z1 |
2 | x1 - y1 |
2 | z1 - x1 |
- Everyday I want to use 1 combination of each group (represented by group_id) for n = 30 days. I want the code to have variable n = 30, so that I can vary this number later if required.
- Some groups might have more than n = 30 combinations and some groups may have less than n = 30 combinations to begin with.
Expected output:
days | group_id | user_id |
---|---|---|
day 1 | 1 | a1 - d1 |
day 2 | 1 | b1 - c1 |
day 3 | 1 | d1 - c1 |
day 4 | 1 | a1 - b1 |
day 5 | 1 | b1 - d1 |
day 6 | 1 | c1 - a1 |
day 7 | 1 | y1 - z1 |
.. | .. | .. |
day 19 | 1 | a1 - d1 |
day 20 | 1 | b1 - c1 |
day 21 | 1 | d1 - c1 |
day 22 | 1 | a1 - b1 |
day 23 | 1 | b1 - d1 |
day 24 | 1 | c1 - a1 |
day 25 | 1 | y1 - z1 |
day 26 | 1 | x1 - y1 |
day 27 | 1 | z1 - x1 |
day 28 | 1 | a1 - d1 |
day 29 | 1 | b1 - c1 |
day 30 | 1 | d1 - c1 |
day 1 | 2 | .. |
A simple
pd.concat([x]*2)
repeats the whole dataframe twice of n times, which is not the output that I am expecting. Is there any way to repeat such a pattern??
Update code dump that i have tried so far.
Basically querying each a every group and repeating sequence of that and you know somehow merging them all in the end. Probably the most inefficient solution. But am not sure how else to do this...
group_list = set(df['group_id'])
for i in group_list:
df1 = df.query(f'group_id == {i}')
# assuming the worst case scenario to be a group containing only 1 combination
df1 = pd.concat([df1]*30)
df1 = df1.head(30)
答案1
得分: 1
这里,这不算太糟糕。您想要创建一个重复长度等于每个组中行数的序列。首先,我们将将df拆分为组,然后迭代每个组。我们将使用itertools中的一些技巧(list(islice(cycle(range(4)),7))
-> [0, 1, 2, 3, 0, 1, 2]
)来使我们的序列重复,并获取我们想要的行的索引。然后,我们将选择这些行并将索引设置为每月的日期。
import pandas as pd
from itertools import cycle,islice
df = [[1, 'a1 - d1'],
[1, 'b1 - c1'],
[1, 'd1 - c1'],
[1, 'a1 - b1'],
[1, 'b1 - d1'],
[1, 'c1 - a1'],
[2, 'y1 - z1'],
[2, 'x1 - z1'],
[2, 'z1 - x1']]
# 创建 pandas DataFrame
df = pd.DataFrame(df, columns=['group_id', 'combinations'])
grouped = df.groupby('group_id')
out = {}
for grp_id, grp_data in grouped: # 1,2
indexes = islice(cycle(range(len(grp_data))), 30)
result = pd.DataFrame(grp_data.iloc[indexes])
result.index = range(1,31)
out[grp_id] = result
print(out)
{1: group_id combinations
1 1 a1 - d1
2 1 b1 - c1
3 1 d1 - c1
4 1 a1 - b1
5 1 b1 - d1
6 1 c1 - a1
7 1 a1 - d1
8 1 b1 - c1
9 1 d1 - c1
10 1 a1 - b1
11 1 b1 - d1
12 1 c1 - a1
13 1 a1 - d1
14 1 b1 - c1
15 1 d1 - c1
16 1 a1 - b1
17 1 b1 - d1
18 1 c1 - a1
19 1 a1 - d1
20 1 b1 - c1
21 1 d1 - c1
22 1 a1 - b1
23 1 b1 - d1
24 1 c1 - a1
25 1 a1 - d1
26 1 b1 - c1
27 1 d1 - c1
28 1 a1 - b1
29 1 b1 - d1
30 1 c1 - a1, 2: group_id combinations
1 2 y1 - z1
2 2 x1 - z1
3 2 z1 - x1
4 2 y1 - z1
5 2 x1 - z1
6 2 z1 - x1
7 2 y1 - z1
8 2 x1 - z1
9 2 z1 - x1
10 2 y1 - z1
11 2 x1 - z1
12 2 z1 - x1
13 2 y1 - z1
14 2 x1 - z1
15 2 z1 - x1
16 2 y1 - z1
17 2 x1 - z1
18 2 z1 - x1
19 2 y1 - z1
20 2 x1 - z1
21 2 z1 - x1
22 2 y1 - z1
23 2 x1 - z1
24 2 z1 - x1
25 2 y1 - z1
26 2 x1 - z1
27 2 z1 - x1
28 2 y1 - z1
29 2 x1 - z1
30 2 z1 - x1}
英文:
Here, this is not so bad. You're looking to create a sequence that repeats of the length of the number of rows in each group. We'll first split our df into groups, then iterate through each group. We'll use some tricks from itertools (list(islice(cycle(range(4)),7))
-> [0, 1, 2, 3, 0, 1, 2]
) to get our sequence to repeat and get indices of the rows we want. We'll then select those rows and set the index to the day of the month.
import pandas as pd
from itertools import cycle,islice
df = [[1, 'a1 - d1'],
[1, 'b1 - c1'],
[1, 'd1 - c1'],
[1, 'a1 - b1'],
[1, 'b1 - d1'],
[1, 'c1 - a1'],
[2, 'y1 - z1'],
[2, 'x1 - z1'],
[2, 'z1 - x1']]
# Create the pandas DataFrame
df = pd.DataFrame(df, columns=['group_id', 'combinations'])
grouped = df.groupby('group_id')
out = {}
for grp_id, grp_data in grouped: # 1,2
indexes = islice(cycle(range(len(grp_data))), 30)
result = pd.DataFrame(grp_data.iloc[indexes])
result.index = range(1,31)
out[grp_id] = result
print(out)
{1: group_id combinations
1 1 a1 - d1
2 1 b1 - c1
3 1 d1 - c1
4 1 a1 - b1
5 1 b1 - d1
6 1 c1 - a1
7 1 a1 - d1
8 1 b1 - c1
9 1 d1 - c1
10 1 a1 - b1
11 1 b1 - d1
12 1 c1 - a1
13 1 a1 - d1
14 1 b1 - c1
15 1 d1 - c1
16 1 a1 - b1
17 1 b1 - d1
18 1 c1 - a1
19 1 a1 - d1
20 1 b1 - c1
21 1 d1 - c1
22 1 a1 - b1
23 1 b1 - d1
24 1 c1 - a1
25 1 a1 - d1
26 1 b1 - c1
27 1 d1 - c1
28 1 a1 - b1
29 1 b1 - d1
30 1 c1 - a1, 2: group_id combinations
1 2 y1 - z1
2 2 x1 - z1
3 2 z1 - x1
4 2 y1 - z1
5 2 x1 - z1
6 2 z1 - x1
7 2 y1 - z1
8 2 x1 - z1
9 2 z1 - x1
10 2 y1 - z1
11 2 x1 - z1
12 2 z1 - x1
13 2 y1 - z1
14 2 x1 - z1
15 2 z1 - x1
16 2 y1 - z1
17 2 x1 - z1
18 2 z1 - x1
19 2 y1 - z1
20 2 x1 - z1
21 2 z1 - x1
22 2 y1 - z1
23 2 x1 - z1
24 2 z1 - x1
25 2 y1 - z1
26 2 x1 - z1
27 2 z1 - x1
28 2 y1 - z1
29 2 x1 - z1
30 2 z1 - x1}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论