2015-12-16 6 views
1

У меня есть следующие DataFrame:Скопируйте значения в новый столбец с формулой

geo col1 col2 
0 CA A  1 
1 CA A  2 
2 CA B  1 
3 CA B  2 
4 CA B  1 
5 CA C  1 
6 CA C  2 

Моя цель состоит в том, чтобы создать новый column, который копирует значение из col2 если col2 == 1 и скопировать значение из col1 если col2 == 2 ,

Геокоманда включена в изображение, потому что в конце концов я хотел бы создать оператор if, который делает это несколько иначе для 15-20 состояний в США.

Конечная цель будет выглядеть следующим образом:

geo col1 col2 col3 
0 CA A  1 1 
1 CA A  2 A 
2 CA B  1 1 
3 CA B  2 B 
4 CA B  1 1 
5 CA C  1 1 
6 CA C  2 C 
+1

(Помимо этого, это более удобно для людей, которые пытаются помочь, если вы отправляете * текст *, а не изображения. Текст может быть легко скопирован, тогда как если кто-то захочет проверить свой код на ваших данных примера, ему придется набирать его в элементе по элементу.) – DSM

ответ

1

Вы можете обернуть условные операторы копирования в функцию, чтобы различные случаи более управляемым (see docs):

def copy_function(row): 
    if row['col2']==1: 
     return row['col2'] 
    else: 
     return row['col1'] 
df['col3'] = df.apply(copy_function, axis=1) 
+0

это работает, но когда я начинаю добавлять во всех случаях исключения, он становится довольно длинным/неуправляемым. Как мне перевести это на автономную функцию? – Josh

+0

Обновлено. Вы можете развернуть операторы 'if/elif/else', как вы пожелаете. http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.apply.html – Stefan

0

надеюсь, что это помогает.

for row in rows: 
    row['col3'] = row['col1'] if row['col2'] == 2 else row['col2'] 
+0

Затем я сохраняю его как функцию и применяю его к файлу данных или могу Я просто запускаю это на своем собственном компьютере и добавляю его в исходный столбец df? – Josh

+0

будет работать в обоих направлениях. если вы решите использовать функцию, просто убедитесь, что данные переданы как действительные итерационные для этого случая. –

0

Вы можете использовать список понимание:

df['col3'] = [c2 if c2 == 1 else (c1 if c2 == 2 else None) 
       for c1, c2 in zip(df.col1, df.col2)] 

>>> df 
    geo col1 col2 col3 
0 CA A  1 1 
1 CA A  2 A 
2 CA B  1 1 
3 CA B  2 B 
4 CA B  1 1 
5 CA C  1 1 
6 CA C  2 C 

Учитывая ваше исключение случаи, указанные в ваших комментариях, вы также можете использовать iterrows:

df['col3'] = None 
for n, row in df.iterrows(): 
    if row.col2 == 1: 
     df.ix[n, 'col3'] = row.col2 
    elif row.col2 == 2: 
     df.ix[n, 'col3'] = row.col1 
    # Other cases. 
Смежные вопросы