根据其他2列的值创建新的数据框列

时间:2020-04-18 19:55:18

标签: python string pandas dataframe lambda

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

我想创建一个第三列,如果其中一列是NoneType,它将采用字符串的值。并且在两个都是字符串的情况下,将两者串联起来。

我该怎么做?

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

2 个答案:

答案 0 :(得分:4)

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)

答案 1 :(得分:-1)

解决方案

您可以将所有NaN替换为空字符串,然后对列(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