我有以下数据框:
id begcost endcost
100 1 3
200 10 12
我想:
id newcost
100 1
100 2
100 3
200 10
200 11
200 12
基本上我需要为begcost和endcost列中的每个值创建一个新行。尝试了多种转置选项,但似乎无法达到我需要的TIA。
答案 0 :(得分:5)
pd.DataFrame(
[(i, j) for i, b, e in df.itertuples(index=False) for j in range(b, e + 1)],
columns=['id', 'newcost']
)
id newcost
0 100 1
1 100 2
2 100 3
3 200 10
4 200 11
5 200 12
计时
%%timeit
(df.set_index('id').apply(lambda x: pd.Series(np.arange(x.iloc[0],x.iloc[1]+1)), axis=1)
.reset_index()
.melt(id_vars='id')
.drop('variable', axis=1)
.rename(columns={'value':'newcost'}))
100 loops, best of 3: 3.03 ms per loop
%%timeit
pd.DataFrame(
[(i, j) for i, b, e in df.itertuples(index=False) for j in range(b, e + 1)],
columns=['id', 'newcost']
)
1000 loops, best of 3: 1.01 ms per loop
答案 1 :(得分:4)
df_out = (df.set_index('id').apply(lambda x: pd.Series(np.arange(x.iloc[0],x.iloc[1]+1)), axis=1)
.reset_index()
.melt(id_vars='id')
.drop('variable', axis=1)
.rename(columns={'value':'newcost'}))
输出:
id newcost
0 100 1
1 200 10
2 100 2
3 200 11
4 100 3
5 200 12