展开熊猫列而不合并

时间:2018-11-01 16:31:30

标签: python pandas numpy dataframe

假设我有一个像这样的熊猫数据框:

    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'])

2 个答案:

答案 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.arangeiloc代替range

df.set_index('A').reindex(np.arange(df.iloc[0,0], df.iloc[-1,0]+1)).reset_index()

答案 1 :(得分:1)

使用生成器的选项

-vmargs