2017-03-03 105 views
0

我有一個熊貓數據幀,看起來像下面這樣:壓縮大熊貓據幀基於列名和最後一個非NaN的值

col1 col2 x_1 x_2 x_3 x_4 
a b 0.3 0.2 NaN NaN 
c d 0.4 0.3 0.2 NaN 
e f 0.2 0.1 NaN NaN 
v x NaN 0.2 NaN NaN 
x r NaN NaN NaN NaN 

我想要做的是對每一行找到最右邊的數值,並重組了兩個新列數據框,第一個包含列名,第二個最右邊的值,就像這樣:

col1 col2 col3 col4 
a b x_2 0.2 
c d x_3 0.2 
e f x_2 0.1 
v x x_2 0.2 
x r None None 

是否有一個簡單的方法來做到這一點,可能使用pandas.apply

回答

2

一種選擇是融化的數據幀,使之長期,而不是廣泛的分組由col1和COL2,並考慮最後一個非NaN值:

with_value = pd.melt(
    df, 
    id_vars = ['col1', 'col2'], 
    var_name='col3', 
    value_name='col4' 
).dropna() 

它給你:

col1 col2 col3 col4 
0  a b x_1 0.3 
1  c d x_1 0.4 
2  e f x_1 0.2 
5  a b x_2 0.2 
6  c d x_2 0.3 
7  e f x_2 0.1 
8  v x x_2 0.2 
11 c d x_3 0.2 

然後分組並取最後一個值...

last_value = with_value.groupby(['col1', 'col2']).last() 

它給你:

  col3 col4 
col1 col2   
a b  x_2 0.2 
c d  x_3 0.2 
e f  x_2 0.1 
v x  x_2 0.2 

然後重新索引和刪除索引得到你想要的東西,如:

final = last_value.reindex([df.col1, df.col2]).reset_index() 

爲您提供:

col1 col2 col3 col4 
0 a b x_2 0.2 
1 c d x_3 0.2 
2 e f x_2 0.1 
3 v x x_2 0.2 
4 x r NaN NaN 
+0

謝謝 - 完美的作品。 – mvarchar

相關問題