Python 如何使用数据表中另一列的范围展开数据表
我有下面的数据表Python 如何使用数据表中另一列的范围展开数据表,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有下面的数据表 import pandas as pd dt = pd.DataFrame({'id_audience': ['Female 13-17', 'Female 18-20'], 'gender': ['female', 'female'], 'age_min': [13, 18], 'age_max': [17, 20]}) 我想扩展这个
import pandas as pd
dt = pd.DataFrame({'id_audience': ['Female 13-17', 'Female 18-20'],
'gender': ['female', 'female'],
'age_min': [13, 18],
'age_max': [17, 20]})
我想扩展这个数据框,增加一个列(age
),并且age
应该是age\u min
和age\u max
之间的范围
最终结果如下所示:
dt = pd.DataFrame({'id_audience': ['Female 13-17', 'Female 13-17', 'Female 13-17', 'Female 13-17',
'Female 13-17', 'Female 18-20', 'Female 18-20', 'Female 18-20', ],
'gender': ['female', 'female', 'female', 'female', 'female', 'female', 'female', 'female'],
'age_min': [13, 13, 13, 13, 18, 18, 18, 18],
'age_max': [17, 17, 17, 17, 20, 20, 20, 20],
'age': [13, 14, 15, 16, 17, 18, 19, 20]})
有什么想法吗?使用和作为年龄栏的计数器:
dt = dt.loc[dt.index.repeat(dt['age_max'] - dt['age_min'] + 1)]
dt['age'] = dt['age_min'] + dt.groupby(level=0).cumcount()
dt = dt.reset_index(drop=True)
print (dt)
id_audience gender age_min age_max age
0 Female 13-17 female 13 17 13
1 Female 13-17 female 13 17 14
2 Female 13-17 female 13 17 15
3 Female 13-17 female 13 17 16
4 Female 13-17 female 13 17 17
5 Female 18-20 female 18 20 18
6 Female 18-20 female 18 20 19
7 Female 18-20 female 18 20 20
这里有一种方法可以使用新的pandas 0.25.0explode
s=dt['id_audience'].str.extractall('(\d+)')
dt['age']= [list(range(y.iloc[0,0],y.iloc[1,0]+1)) for x , y in s.astype(int).groupby(level=0)]
dt=dt.explode('age').reset_index(drop=True)
也可以像@Wen一样使用explode
,但在最小/最大年龄列上直接访问范围
输出中的第4行不正确,您使用了第二组的范围,但第一组的值您是对的,我更正了它,谢谢您我认为它需要一个+1
此处:观众=观众.loc[audients.index.repeat(观众['e']-观众['age']+1)]
,以包括上一组bound@quant-谢谢,对不起,我很想念它。很好的用法:-)伙计
dt.assign(
age=[np.arange(x, y+1) for x, y in zip(dt['age_min'], dt['age_max'])]
).explode('age').reset_index(drop=True)
id_audience gender age_min age_max age
0 Female 13-17 female 13 17 13
1 Female 13-17 female 13 17 14
2 Female 13-17 female 13 17 15
3 Female 13-17 female 13 17 16
4 Female 13-17 female 13 17 17
5 Female 18-20 female 18 20 18
6 Female 18-20 female 18 20 19
7 Female 18-20 female 18 20 20