У меня есть следующие 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 if col2 == 1 и скопирует значение из col1 if col2 == 2.

Столбец geo включен в изображение, потому что в конечном итоге я хотел бы создать оператор 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
Josh 16 Дек 2015 в 19:28

3 ответа

Лучший ответ

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

def copy_function(row):
    if row['col2']==1:
        return row['col2'] 
    else: 
        return row['col1']
df['col3'] = df.apply(copy_function, axis=1)
1
Stefan 16 Дек 2015 в 16:59

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

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.
0
Alexander 16 Дек 2015 в 17:07

Надеюсь это поможет.

for row in rows:
    row['col3'] = row['col1'] if row['col2'] == 2 else row['col2']
0
rajesh.kanakabandi 16 Дек 2015 в 16:37