【问题标题】:Create new dataframe column from the values of 2 other columns从其他 2 列的值创建新的数据框列
【发布时间】:2020-04-18 19:55:18
【问题描述】:

我的数据框中有 2 列。在任何一个实例(行)中,至少其中一列中包含字符串值,另一列中可能包含 NoneType 或另一个字符串。

我想创建第三列,在其中一列是 NoneType 的情况下,将采用字符串的值。在两者都是字符串的情况下,将两者连接起来。

我该怎么做?

  column1  column2         column3
0   hello     None           hello
1    None  goodbye         goodbye
2   hello  goodbye  hello, goodbye

【问题讨论】:

    标签: python string pandas dataframe lambda


    【解决方案1】:

    Series.str.cat

    使用na_rep='',因此缺少值的连接不会导致整行的NaN。然后 strip 由于缺少数据而加入的任何多余分隔符(假设分隔符也不会开始或结束您的任何单词)。

    import pandas as pd
    df = pd.DataFrame({'column1': ['hello', None, 'hello'],
                       'column2': [None, 'goodbye', 'goodbye']})
    
    sep = ', '
    df['column3'] = (df['column1'].str.cat(df['column2'], sep=sep, na_rep='')
                       .str.strip(sep))
    
    print(df)
      column1  column2         column3
    0   hello     None           hello
    1    None  goodbye         goodbye
    2   hello  goodbye  hello, goodbye
    

    对于许多列,中间可能存在缺失数据的条纹,上述方法无法删除多余的分隔符。相反,您可以沿行使用慢速lambda。我们在删除空值后加入所有值:

    df['column3'] = df.apply(lambda row: ', '.join(row.dropna()), axis=1)
    

    【讨论】:

      【解决方案2】:

      解决方案

      您可以将所有NaNs 替换为空字符串,然后将列(A 和 B)联系起来以创建列 C。

      df2 = df.fillna('')
      df['C'] = df2.A.str.strip() + df2.B.str.strip(); #del df2;
      print(df)
      

      输出

             A     B    C=A+B
      0      1     3       13
      1      2  None        2
      2    dog   dog   dogdog
      3   None  None         
      4  snake    20  snake20
      5    cat  None      cat
      

      虚拟数据

      d = {
          'A': ['1', '2', 'dog', None, 'snake', 'cat'], 
          'B': ['3', None, 'dog', None, '20', None]
      }
      df = pd.DataFrame(d)
      print(df)
      

      输出

             A     B
      0      1     3
      1      2  None
      2    dog   dog
      3   None  None
      4  snake    20
      5    cat  None
      

      【讨论】:

        猜你喜欢
        • 2021-10-03
        • 2014-12-04
        • 2017-01-03
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多