2016-03-10 5 views
2

Это мой первый вопрос на StackOverflow, так что дайте мне знать, если я должен сформулировать что-нибудь иначе ...Заменить некоторые конкретные значения в столбце панд в зависимости от условий в другом столбце

Я хочу заменить некоторые значения в панд Столбец Dataframe, зависящий от состояния, связанного со значениями в другом столбце, но оставьте исходные значения, если условие False. Например:

import pandas as pd  
df=pd.DataFrame({'col1':['A','B','C','B'], 'col2':['z','x','x','x']}, 
        columns=['col1','col2']) 

df = 
    col1 col2 
0 A z 
1 B x 
2 C x 
3 B x 

Скажем, я хочу, чтобы заменить значения в col2 на «Q», если значение в col1 является «B» или «C», но оставить исходные значения («Z», 'х '), если значение в col1 не равно B или C. На самом деле у меня гораздо больше DataFrame с сотнями уникальных значений в col1 и вы хотите заменить значения в col2 примерно на 20 из них.
Мое текущее решение для создания словаря, используя col1 в качестве ключей и col2 как значения, а затем:

dict1.update({'B':'q'}) 
df[col2] = df[col1].map(dict1) 

Но этот трюк работает только тогда, когда значения в двух столбцах коррелируют точно (или, если значения в col1 являются уникальный).

Так что мне было интересно, есть ли более элегантное решение. Таким образом, замените значение в col2, если col1 соответствует определенному условию, иначе оставите исходное значение.

+0

маски ФР 'df.loc [DF [ 'col1'] == 'B', 'col2'] = DF ['col1']. map (dict1) 'более динамического метода' df.loc [df ['col1']. isin (dict1.keys()), 'col2'] = df ['col1']. map (dict1) ' – EdChum

+0

ok, на самом деле у меня есть целая куча значений в col1, для которых я хочу заменить значение в col2, так как же он будет работать тогда? Я обновлю вопрос – BartDur

+0

Если вы создадите диктовку новых сопоставлений, тогда мой ответ все равно будет работать нормально – EdChum

ответ

3

маску ФР сначала с помощью loc и isin и называть map, как и раньше:

In [376]: 
dict1 = {'B':'q'} 
df.loc[df['col1'].isin(dict1.keys()), 'col2'] = df['col1'].map(dict1) 
df 

Out[376]: 
    col1 col2 
0 A z 
1 B q 
2 C x 
3 B q 
+0

Спасибо! Недостающая часть головоломки использовала функцию loc! – BartDur

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