2017-05-26 59 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()