如何使用 pandas 列动态爆炸?

6 python dataframe pandas

我有一个看起来像这样的数据框

import pandas as pd
import numpy as np
# Create data set.
dataSet = {'id': ['A', 'A', 'B'],
           'id_2': [1, 2, 1] ,
           'number': [320, 169, 120],
           'add_number' : [4,6,3]}

# Create dataframe with data set and named columns.
df = pd.DataFrame(dataSet, columns= ['id', 'id_2','number', 'add_number'])

    id  id_2    number  add_number
0   A   1        320       4
1   A   2        169       6
2   B   1        120       3
Run Code Online (Sandbox Code Playgroud)

我想使用 number 和 add_number ,这样我就可以动态地分解它,即) 320 + 4 将有 [320,321,322,323,324] (最多 324,并且想在此分解)

期望的输出

    id  id_2    number
0   A   1        320       
1   A   1        321       
2   A   1        322
3   A   1        323
4   A   1        324
5   A   2        169
6   A   2        170
7   A   2        171
8   A   2        172
9   A   2        173
10  A   2        174
11  A   2        175
12  B   1        120
13  B   1        121
14  B   1        122
15  B   1        123
Run Code Online (Sandbox Code Playgroud)

我查看了explode、wide_to_long pandas 函数,但我不知道从哪里开始,任何方向感将不胜感激!

Sco*_*ton 2

您尝试使用np.arangeand explode

df['range'] = df.apply(lambda x: np.arange(x['number'], x['number']+x['add_number']+1), axis=1)
df.explode('range')
Run Code Online (Sandbox Code Playgroud)

或者

df['range'] = [np.arange(n, n+a+1) for n, a in zip(df['number'],df['add_number'])] 
df.explode('range')
Run Code Online (Sandbox Code Playgroud)

输出:

  id  id_2  number  add_number range
0  A     1     320           4   320
0  A     1     320           4   321
0  A     1     320           4   322
0  A     1     320           4   323
0  A     1     320           4   324
1  A     2     169           6   169
1  A     2     169           6   170
1  A     2     169           6   171
1  A     2     169           6   172
1  A     2     169           6   173
1  A     2     169           6   174
1  A     2     169           6   175
2  B     1     120           3   120
2  B     1     120           3   121
2  B     1     120           3   122
2  B     1     120           3   123
Run Code Online (Sandbox Code Playgroud)