在Pandas中合并包含NaN的相邻列

时间:2017-10-02 20:18:04

标签: python pandas dataframe nan

一列有NaN和一些值,其他列也有NaN和一些值。两列都不可能具有值,但两列都可能具有NaN。有没有办法将列合并在一起? 我尝试过选择一个列df.fillna和一个论坛,但是没有用。

quad_data['new'] = quad_data.apply(lambda x: function(x.a, x.b, const_a, const_b), axis=1)
df1 = pd.merge(df1, quad_data[['a','b','new']], left_on=['a','b'], right_on = ['a','b'], how='inner')


    new_x       new_y
0   NaN         0.997652
1   NaN         0.861592
2   0           NaN
3   0.997652    NaN
4   0.861592    NaN
5   2.673742    NaN
6   2.618845    NaN
7   NaN         0.432525
8   NaN         NaN
9   0.582576    NaN
10  0.50845     NaN
11  NaN         0.341510
12  NaN         0.351510
13  1.404787    NaN
14  2.410116    NaN
15  0.540265    NaN
16  NaN         1.404787
17  NaN         2.410116
18  NaN         0.540265
19  NaN         1.403903
20  1.448987    NaN

3 个答案:

答案 0 :(得分:2)

combine_firstfillna一般来说都是不错的选择,但这些替代方案可行,因为NaN是独占的。

选项1
df.max

s = quad_data.max(1)
print(s)
0     0.997652
1     0.861592
2     0.000000
3     0.997652
4     0.861592
5     2.673742
6     2.618845
7     0.432525
8          NaN
9     0.582576
10    0.508450
11    0.341510
12    0.351510
13    1.404787
14    2.410116
15    0.540265
16    1.404787
17    2.410116
18    0.540265
19    1.403903
20    1.448987
dtype: float64

选项2
df.sum

s = quad_data.sum(1)
print(s)
0     0.997652
1     0.861592
2     0.000000
3     0.997652
4     0.861592
5     2.673742
6     2.618845
7     0.432525
8          NaN
9     0.582576
10    0.508450
11    0.341510
12    0.351510
13    1.404787
14    2.410116
15    0.540265
16    1.404787
17    2.410116
18    0.540265
19    1.403903
20    1.448987
dtype: float64
quad_data['new'] = s 

答案 1 :(得分:2)

试试这个.. LOL

df.bfill(1)['new_x']
Out[45]: 
0     0.997652
1     0.861592
2     0.000000
3     0.997652
4     0.861592
5     2.673742
6     2.618845
7     0.432525
8          NaN
9     0.582576
10    0.508450
11    0.341510
12    0.351510
13    1.404787
14    2.410116
15    0.540265
16    1.404787
17    2.410116
18    0.540265
19    1.403903
20    1.448987
Name: new_x, dtype: float64

答案 2 :(得分:1)

您可以使用combine_first

df['new'] = df['new_x'].combine_first(df['new_y'])

或者只是

df['new'] = df['new_x'].fillna(df['new_y'])

你得到了

    new_x       new_y       new
0   NaN         0.997652    0.997652
1   NaN         0.861592    0.861592
2   0.000000    NaN         0.000000
3   0.997652    NaN         0.997652
4   0.861592    NaN         0.861592
5   2.673742    NaN         2.673742
6   2.618845    NaN         2.618845
7   NaN         0.432525    0.432525
8   NaN         NaN         NaN
9   0.582576    NaN         0.582576
10  0.508450    NaN         0.508450
11  NaN         0.341510    0.341510
12  NaN         0.351510    0.351510
13  1.404787    NaN         1.404787
14  2.410116    NaN         2.410116
15  0.540265    NaN         0.540265
16  NaN         1.404787    1.404787
17  NaN         2.410116    2.410116
18  NaN         0.540265    0.540265
19  NaN         1.403903    1.403903
20  1.448987    NaN         1.448987