添加行pandas最优雅的方式

时间:2017-05-26 11:45:30

标签: python pandas

在数据框中追加行的最优雅方式是:

     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 个答案:

答案 0 :(得分: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

time列中带有merge的重复项解决方案:

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

答案 1 :(得分:1)

假设您想要做的是以这样的方式连接表,即在我将调用df1和df2的两个表之间不重复行,您可以使用:

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

答案 2 :(得分:1)

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

  • 将时间设为索引
  • 使用reindex创建缺少的条目
  • 反转订单以使最高(时间)位于最前面
  • 重置索引

代码:

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