#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!