Создать новый столбец данных из значений двух других столбцов - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть 2 столбца в моем фрейме данных. В любом одном экземпляре (строке), по крайней мере, в одном из столбцов есть строковое значение, возможно, что в другом столбце есть NoneType или другая строка.

Я хочу создать третий столбец, который в случае, когда один из столбцов является NoneType, будет принимать значение строки. А в случае, когда обе строки являются строками, примут объединение двух.

Как я могу это сделать?

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

Ответы [ 2 ]

4 голосов
/ 18 апреля 2020

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)
0 голосов
/ 18 апреля 2020

Решение

Можно заменить все 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...