根据列名和最后一个非NaN值压缩pandas数据帧

时间:2017-03-03 18:08:02

标签: python pandas dataframe

我有一个如下所示的pandas数据框:

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

答案 0 :(得分:3)

一种选择是融合DataFrame使其变长而不是通过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

答案 1 :(得分:0)