【问题标题】:Merge adjacent columns containing NaNs in Pandas在 Pandas 中合并包含 NaN 的相邻列
【发布时间】:2017-10-04 10:35:17
【问题描述】:

一列有 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

【问题讨论】:

标签: python pandas dataframe nan


【解决方案1】:

combine_firstfillna 通常是不错的替代方案,但这些替代方案有效,因为您的 NaNs 是专有的。

选项 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 

【讨论】:

  • 太棒了!
【解决方案2】:

试试这个..哈哈

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

【讨论】:

  • bfill 沿第一轴?很有创意!
  • @cᴏʟᴅsᴘᴇᴇᴅ 很难在你的人框外思考:)
  • @Wen,我认为这是最惯用和通用的解决方案。 ++
【解决方案3】:

你可以使用 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

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 2019-07-04
    • 2021-12-07
    • 2019-02-20
    • 2018-01-10
    • 2019-07-26
    • 2019-12-19
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多