вопрос pd.DataFrame: изменение значения в ячейке на основе списка условий

#pandas

#pandas

Вопрос:

У меня есть следующие данные о режиме транспортировки и времени. Я хотел бы поменять местами значения в столбцах «режим» и «время», когда значение не является конкретным значением из списка. Например, на показанном изображении (нажмите ссылку ниже) я хочу переместить ячейки, в которых указано «10 минут», в столбец «время» и поменять местами эти значения в столбце «время» на столбец «режим».

моя таблица

Я пробовал несколько подходов, включая функцию np.where, но я не могу в этом разобраться. Итак, я остановился на цикле for. Смотрите ниже.

 newdtf = pd.DataFrame()

for value in transport2['mode'].unique():

    mylist = ["Dala-dala", "Boda-boda", "Walk", "Private vehicle", 
              "Bicycle", "BRT", "Bajaj", "Traffic", "Uber"]
    if value in mylist:
    continue
    else:
        tempdtf=pd.DataFrame({'hhid': transport2.loc[transport2.time == mode, 'hhid'], 
                              'mode': transport2.loc[transport2.time == mode, 'mode'], 
                             'time': mode})

    #Join
    newdtf = newdtf.append(tempdtf)

  

Однако newdtf не отображает желаемые результаты.

Ответ №1:

Сначала я воссоздаю ваш фрейм данных. В будущих вопросах было бы полезно, если бы вы выполнили этот шаг при задании вопросов в stackoverflow.

 df = pd.DataFrame({'mode':['Dala-dala','Dala-dala','Dala-dala','Dala-dala','Dala-dala', '10 minutes', '10 minutes', 'Dala-dala', 'Private vehicle', 'Private vehicle'], 
              'time':['30 minutes', '20 minutes', '20 minutes', '2 hours 30 minutes', '10 minutes', 'Walk', 'Walk', '60 minutes', '3 hours', '2 hours 30 minutes']})

mylist = ["Dala-dala", "Boda-boda", "Walk", "Private vehicle", 
              "Bicycle", "BRT", "Bajaj", "Traffic", "Uber"]
  

Затем мы создаем новый временный столбец для хранения отфильтрованных значений «режима», отфильтрованных в вашем списке.

 df['mode_temp']= df[~df['mode'].isin(mylist)]['mode']
  

Затем мы фильтруем фрейм данных для значений в mode_temp, а затем делаем ‘mode’ равным ‘time’.

 df['mode'][df['mode_temp'].notnull()]= df['time']
  

Повторите и сделайте ‘time’ равным ‘mode’.

 df['time'][df['mode_temp'].notnull()]= df['mode_temp']
  

Удалите временный столбец.

 df = df[['mode', 'time']]

df

             mode                time
0        Dala-dala          30 minutes
1        Dala-dala          20 minutes
2        Dala-dala          20 minutes
3        Dala-dala  2 hours 30 minutes
4        Dala-dala          10 minutes
5             Walk          10 minutes
6             Walk          10 minutes
7        Dala-dala          60 minutes
8  Private vehicle             3 hours
9  Private vehicle  2 hours 30 minutes
  

В целом код выглядит следующим образом:

 df = pd.DataFrame({'mode':['Dala-dala','Dala-dala','Dala-dala','Dala-dala','Dala-dala', '10 minutes', '10 minutes', 'Dala-dala', 'Private vehicle', 'Private vehicle'], 
              'time':['30 minutes', '20 minutes', '20 minutes', '2 hours 30 minutes', '10 minutes', 'Walk', 'Walk', '60 minutes', '3 hours', '2 hours 30 minutes']})

mylist = ["Dala-dala", "Boda-boda", "Walk", "Private vehicle", 
              "Bicycle", "BRT", "Bajaj", "Traffic", "Uber"]

df['mode_temp']= df[~df['mode'].isin(mylist)]['mode']

df['mode'][df['mode_temp'].notnull()]= df['time']

df['time'][df['mode_temp'].notnull()]= df['mode_temp']

df = df[['mode', 'time']]
  

Комментарии:

1. Вау, большое спасибо! Никогда бы не понял этого! Конечно, в следующий раз я обязательно добавлю фрейм данных вместо прикрепления изображения. Вы сэкономили мне много времени вдали от Excel!