2015-12-16 3 views
1

Я пытаюсь конкатенировать две колонки в пандах DataFrame. Проблема в том, что в обеих сериях существует значение None, результатом является NaN. Поскольку реальные данные очень большие, и есть значение, чтобы сохранить исходные значения None для последующей ссылки, я надеюсь не изменять исходное значение в столбцах. Есть ли способ добиться этого в пандах?Конкатенация двух серий без значения None (pandas DataFrame)?

Чтобы создать пример DataFrame:

import pandas as pd 
f = pd.DataFrame([['a', 'b','c','a', 'b','c'],['1', '2','3', '4', '5','6', ]]) 
f = f.transpose() 
f.columns = ['xx', 'yy'] 
f.xx[0] = None 
f.yy[0] = None 
f.xx[2] = None 
f.yy[3] = None 

    xx  yy 
0 None None 
1 b  2 
2 None 3 
3 a  None 
4 b  5 
5 c  6 

Я попытался f['new_str'] = f.xx + f.yy и f['new_str'] = f['xx'] + f['yy']. Оба устанавливают объединенное значение в NaN, если какое-либо значение имеет тип None. Я думаю, это связано с тем, как pandas обрабатывают тип None. Тип None и тип str не могут быть «добавлены» оператором «+».

xx  yy  new_str 
0 None None NaN 
1 b  2  b2 
2 None 3  NaN 
3 a  None NaN 
4 b  5  b5 
5 c  6  c6 

Вот что я хочу сделать:

f['new_str'] = f.xx.map(lambda x: '') 
for idx, arow in f.iterrows(): 
    con = '' 
    if arow.xx: 
     con += arow.xx 
    if arow.yy: 
     con += arow.yy 
    f.loc[idx,'new_str'] = con 
f 
    xx  yy  new_str 
0 None None  
1 b  2  b2 
2 None 3  3 
3 a  None a 
4 b  5  b5 
5 c  6  c6 

Мой вопрос заключается в том, что делает панды поддерживает более элегантный/простой способ для достижения этой цели?

ответ

3

Позвоните fillna на каждый столбец, чтобы установить Nones на '', который является элементом идентификации при конкатенации строк.

f['new_str'] = f.xx.fillna('') + f.yy.fillna('') 

Это дает новый столбец отформатирован, как вы хотели:

>>> f 
    xx yy new_str 
0 None None   
1  b  2  b2 
2 None  3  3 
3  a None  a 
4  b  5  b5 
5  c  6  c6 
+2

Тот же метод, но не как чистый: 'f.apply (лямбда-строка: (строки [ 'ого'] или '') + (строка ['yy'] или ''), axis = 1) ' –

+0

@pneumatics Спасибо. В исходных данных исходное поле не нужно изменять, потому что «Нет» и пустая строка имеют различный смысл. Есть ли способ сделать это без изменения исходного столбца? Благодарю. – Bin

+1

@ Попробуйте, это не изменит значения в столбцах 'xx' или' yy', потому что они не назначены с левой стороны. 'fillna' работает над копией данных. – pneumatics

Смежные вопросы