【问题标题】:Merging two non-overlapping pandas dataframe columns合并两个不重叠的熊猫数据框列
【发布时间】:2021-09-13 14:37:28
【问题描述】:

我有一个带有一对列的 pandas 数据框,在每一行中,一个单元格是 nan 而另一个不是。它看起来像这样:

Var1 Var2
0 3 nan
1 8 nan
2 nan 6
3 4 nan
4 nan 2
5 nan 6

我想在没有 nan 的情况下将这两列合并为一列:

Var1
0 3
1 8
2 6
3 4
4 2
5 6

有什么想法吗?

【问题讨论】:

  • df.max(1) 呢?

标签: python pandas dataframe nan


【解决方案1】:

使用fillna,将values参数设置为另一个Series。

df['Var1'].fillna(df['Var2'], inplace=True)
df['Var1']

#    Var1
# 0  3
# 1  8
# 2  6
# 3  4
# 4  2
# 5  6

【讨论】:

  • .drop('Var2',1) 匹配 OP 输出
【解决方案2】:

您可以按照以下方式利用 numpy 完成此任务

import numpy as np
import pandas as pd
df = pd.DataFrame({'v1':[np.nan,2,np.nan,4],'v2':[1,np.nan,3,np.nan]})
df['v'] = np.where(np.isnan(df.v1),df.v2,df.v1)
print(df)

输出

    v1   v2    v
0  NaN  1.0  1.0
1  2.0  NaN  2.0
2  NaN  3.0  3.0
3  4.0  NaN  4.0

【讨论】:

    【解决方案3】:

    您可以stack 默认情况下将丢弃NaNs 的框架。然后你可以用它的值构造一个新的框架:

    >>> new_df = pd.DataFrame(df.stack().to_numpy(), columns=["Var1"])
    >>> new_df
    
       Var1
    0   3.0
    1   8.0
    2   6.0
    3   4.0
    4   2.0
    5   6.0
    

    【讨论】:

      【解决方案4】:

      另一个版本:

      df = df.transform(sorted, key=pd.isna, axis=1).dropna(axis=1, how="all")
      print(df)
      

      打印:

            ID  var1
      0  103.0  11.0
      1  104.0  16.0
      2  105.0  71.0
      3  106.0   2.0
      3  107.0   1.0
      

      【讨论】:

        【解决方案5】:

        另一种方法 - 如果您只有两列。

        df.assign(Var1=df.sum(axis=1))[['Var1']]
        
           Var1
        0   3.0
        1   8.0
        2   6.0
        3   4.0
        4   2.0
        5   6.0
        

        【讨论】:

          猜你喜欢
          • 2017-11-26
          • 1970-01-01
          • 2017-11-13
          • 2017-06-11
          • 2016-01-01
          • 1970-01-01
          相关资源
          最近更新 更多