Как перебрать два столбца pandas и создать новый столбец - PullRequest
1 голос
/ 16 апреля 2020

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

master['work_action'] = np.nan
for a,b in zip(master['repair_location'],master['work_service']):
    if a == 'Field':
        master['work_action'].append(a + " " + b)
    elif a == 'Depot':
        master['work_action'].append(a + " " + b)
    else:
        master['work_action'].append(a)

TypeError: cannot concatenate object of type '<class 'str'>'; only Series and DataFrame objs are valid

Проблема с master['work_action'].append(a + " " + b)

Если я изменю свой код на это:

test = []
for a,b in zip(master['repair_location'],master['work_service']):
    if a == 'Field':
        test.append(a + " " + b)
    elif a == 'Depot':
        test.append(a + " " + b)
    else:
        test.append(a)

Я получаю именно то, что хочу в списке. Но я хочу это в pandas столбце. Как создать новый столбец pandas с указанными выше условиями?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Если важна производительность, я бы использовал numpy select:

master = pd.DataFrame(
    {
        'repair_location': ['Field', 'Depot', 'Other'],
        'work_service':[1, 2, 3]
    }
)

master['work_action'] = np.select(
    condlist= [
        master['repair_location'] == 'Field',
        master['repair_location'] == 'Depot'
    ],
    choicelist= [
        master['repair_location'] + ' ' + master['work_service'].astype(str),
        master['repair_location'] + ' ' + master['work_service'].astype(str)
    ],
    default= master['repair_location']
)

, что приводит к:

  repair_location  work_service work_action
0           Field             1     Field 1
1           Depot             2     Depot 2
2           Other             3       Other

0 голосов
/ 16 апреля 2020

Метод добавления предназначен для вставки значений в конце. Вы пытаетесь объединить два строковых значения. Используйте apply метод:

def fun(a,b):
    if a == 'Field':
        return a + " " + b
    elif a == 'Depot':
        return a + " " + b
    else:
       return a

master['work_action'] = master.apply(lambda x: fun(x['repair_location'], x['work_service']), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...