假设我有一个像这样的熊猫数据框:
A B C
0 2 19 12
1 5 17 13
2 6 16 19
3 7 11 16
4 10 1 11
我希望它像这样在A列上展开:
A B C
0 2 19.0 12.0
1 3 NaN NaN
2 4 NaN NaN
3 5 17.0 13.0
4 6 16.0 19.0
5 7 11.0 16.0
6 8 NaN NaN
7 9 NaN NaN
8 10 1.0 11.0
这是我目前的操作方式,创建一个包含密集整数列表的numpy数组,然后将其与DataFrame一起merge
,创建上面显示的数据框:
new_arr = np.arange(df.iloc[0,0], df.iloc[-1,0]+1)
new_col = pd.Series(new_arr).to_frame()
new_col.columns = ['A']
new_df = pd.merge(new_col, df, on='A', how='left')
但是我觉得必须有更好的方法直接使用系列扩展数据框而不使用merge
,甚至在原始数据框上使用pandas本机函数?谢谢您的任何解决方案。
这是第一个简化复制的df:
pd.DataFrame([[2, 19, 12], [5, 17, 13], [6, 16, 19], [7, 11, 16], [10, 1, 11]], columns=['A', 'B', 'C'])
答案 0 :(得分:4)
将reindex
设置为索引后,您可以使用A
:
>>> df.set_index('A').reindex(range(df.A.min(),df.A.max()+1)).reset_index()
A B C
0 2 19.0 12.0
1 3 NaN NaN
2 4 NaN NaN
3 5 17.0 13.0
4 6 16.0 19.0
5 7 11.0 16.0
6 8 NaN NaN
7 9 NaN NaN
8 10 1.0 11.0
请注意,您也可以使用问题中的np.arange
和iloc
代替range
:
df.set_index('A').reindex(np.arange(df.iloc[0,0], df.iloc[-1,0]+1)).reset_index()
答案 1 :(得分:1)
使用生成器的选项
-vmargs