Python基于数量和增量Pandas式复制行

pxiryf3j  于 2023-03-11  发布在  Python
关注(0)|答案(3)|浏览(183)

我有一个panda Dataframe ,我想根据最小值和最大值复制行(每行的复制次数= max-min)。在顶部,我想创建一个列,其中每行根据相同的最小值和最大值递增。
例如,如果min = 3,max = 6,我希望该行出现4次(重复3次),每次重复的值列的值应该从3到6,并且每次重复都递增。
输入示例:
| 识别号|最小值|最大值|
| - ------|- ------|- ------|
| 产品ABC|三个|六个|
| 产品XXXX|八个|十个|
预期输出:
| 识别号|最小值|最大值|价值|
| - ------|- ------|- ------|- ------|
| 产品ABC|三个|六个|三个|
| 产品ABC|三个|六个|四个|
| 产品ABC|三个|六个|五个|
| 产品ABC|三个|六个|六个|
| 产品XXXX|八个|十个|八个|
| 产品XXXX|八个|十个|九|
| 产品XXXX|八个|十个|十个|

tkclm6bt

tkclm6bt1#

使用Index.repeat乘以列差,加上1,重复DataFrame.loc,最后将计数器列乘以GroupBy.cumcount加到min列:

df1 = df.loc[df.index.repeat(df['max'].sub(df['min']) + 1)]
        
df1['value'] = df1['min'].add(df1.groupby(level=0).cumcount())
print (df1)
             ID  min  max  value
0   Product ABC    3    6      3
0   Product ABC    3    6      4
0   Product ABC    3    6      5
0   Product ABC    3    6      6
1  Product XXXX    8   10      8
1  Product XXXX    8   10      9
1  Product XXXX    8   10     10
tcomlyy6

tcomlyy62#

创建从minmax的范围并分解它们(使用df.explode):

df['value'] = df.apply(lambda x: range(x['min'], x['max'] + 1), axis=1)
df = df.explode('value', ignore_index=True)
ID  min  max value
0   Product ABC     3    6     3
1   Product ABC     3    6     4
2   Product ABC     3    6     5
3   Product ABC     3    6     6
4  Product XXXX     8   10     8
5  Product XXXX     8   10     9
6  Product XXXX     8   10    10
hlswsv35

hlswsv353#

您可以使用Index.repeat复制行,然后使用groupby.cumcount复制新列:

rep = df['max'].sub(df['min']).add(1)

out = (df.loc[df.index.repeat(rep)]
         .assign(value=lambda d: d.groupby('ID').cumcount().add(d['min']))
      )

输出:

ID  min  max  value
0   Product ABC    3    6      3
0   Product ABC    3    6      4
0   Product ABC    3    6      5
0   Product ABC    3    6      6
1  Product XXXX    8   10      8
1  Product XXXX    8   10      9
1  Product XXXX    8   10     10

中间体:

ID  min  max  value  rep  cumcount
0   Product ABC    3    6      3    4         0
0   Product ABC    3    6      4    4         1
0   Product ABC    3    6      5    4         2
0   Product ABC    3    6      6    4         3
1  Product XXXX    8   10      8    3         0
1  Product XXXX    8   10      9    3         1
1  Product XXXX    8   10     10    3         2

相关问题