2017-05-26 36 views
2

什么是附加在数据帧的行这样的最优雅的方式:最优雅的方式来添加行大熊猫

 a b time 
0 nan nan 8 
1 nan nan 5 
2 nan nan 3 

到:

 a b time 
0 nan nan 8 
1 nan nan 7 
2 nan nan 6 
3 nan nan 5 
4 nan nan 4 
5 nan nan 3 
6 nan nan 2 
7 nan nan 1 
8 nan nan 0 

我已经试过是建立一个函数missing_times女巫返回我新的数据帧与时间不足,但我有问题压缩两个数据库在一起。什么是解决这类问题最有效的方法?

回答

3

您可以使用DataFrame构造与reindex_axisnumpy.arange

df = pd.DataFrame({'time':np.arange(df['time'].max() + 1)[::-1]}) 
     .reindex_axis(df.columns, axis=1) 
print (df) 
    a b time 
0 NaN NaN  8 
1 NaN NaN  7 
2 NaN NaN  6 
3 NaN NaN  5 
4 NaN NaN  4 
5 NaN NaN  3 
6 NaN NaN  2 
7 NaN NaN  1 
8 NaN NaN  0 

如果在原来的DF使用价值set_index + reindex + reset_index + reindex_axis

print (df) 
    a b time 
0 4 5  8 
1 2 8  5 
2 1 2  3 


df = df.set_index('time') 
     .reindex(np.arange(df['time'].max() + 1)[::-1]) 
     .reset_index() 
     .reindex_axis(df.columns, axis=1) 
print (df) 
    a b time 
0 4.0 5.0  8 
1 NaN NaN  7 
2 NaN NaN  6 
3 2.0 8.0  5 
4 NaN NaN  4 
5 1.0 2.0  3 
6 NaN NaN  2 
7 NaN NaN  1 
8 NaN NaN  0 

解决方案与重复的timemerge

print (df) 
    a b time 
0 4 5  8 
1 2 3  8 
2 1 2  3 

df1 = pd.DataFrame({'time':np.arange(df['time'].max() + 1)[::-1]}) 
df = pd.merge(df,df1, how='outer').sort_values('time', ascending=False) 
print (df) 
    a b time 
0 4.0 5.0  8 
1 2.0 3.0  8 
3 NaN NaN  7 
4 NaN NaN  6 
5 NaN NaN  5 
6 NaN NaN  4 
2 1.0 2.0  3 
7 NaN NaN  2 
8 NaN NaN  1 
9 NaN NaN  0 
+0

我非常喜欢你的答案!但是你正在构建新的数据框,因此如果a或b中有一些值将被Nan取代。在这种情况下,你是否仍然使用这种代码或者你会构建其他的东西? – poppytop

+1

如果原始数据帧中的值相同,我将添加我的第一个解决方案。谢谢。 – jezrael

+0

对不起,让你烦恼,但我只是想通了,我有我的数据框中重复,所以reindex将无法正常工作。你有更多的建议吗?谢谢! – poppytop

1

假设你想要做的是加入这样一种方式,没有行的两个表,我会打电话给DF1和DF2之间复制表的东西,你可以使用:

df3 = pandas.merge(df1, df2, how='outer') 
df3.sort_values(by='time', ascending=False) 
1

这里是我的方法,它是4个步骤:

  • 将时间设置为指数
  • 使用重新索引创建缺少的条目
  • 反转顺序,使MAX(时间)在顶部
  • 重置指数

代码:

df.set_index('time')\ 
    .reindex(range(max(df['time']) + 1))\ 
    .sort_index(ascending = False)\ 
    .reset_index()