#pandas #dataframe #csv
Вопрос:
У меня есть фрейм данных (около 28000 строк и 61 столбец).
исходными столбцами данных являются:
data.columns
Index(['count_id', 'count_date', 'location_id', 'lanes', 'is_oneway',
'location', 'lng', 'lat', 'centreline_type', 'centreline_id', 'px',
'time_start', 'time_end', 'sb_cars_r', 'sb_cars_t', 'sb_cars_l',
'nb_cars_r', 'nb_cars_t', 'nb_cars_l', 'wb_cars_r', 'wb_cars_t',
'wb_cars_l', 'eb_cars_r', 'eb_cars_t', 'eb_cars_l', 'sb_truck_r',
'sb_truck_t', 'sb_truck_l', 'nb_truck_r', 'nb_truck_t', 'nb_truck_l',
'wb_truck_r', 'wb_truck_t', 'wb_truck_l', 'eb_truck_r', 'eb_truck_t',
'eb_truck_l', 'sb_bus_r', 'sb_bus_t', 'sb_bus_l', 'nb_bus_r',
'nb_bus_t', 'nb_bus_l', 'wb_bus_r', 'wb_bus_t', 'wb_bus_l', 'eb_bus_r',
'eb_bus_t', 'eb_bus_l', 'nx_peds', 'sx_peds', 'ex_peds', 'wx_peds',
'nx_bike', 'sx_bike', 'ex_bike', 'wx_bike', 'nx_other', 'sx_other',
'ex_other', 'wx_other'],
dtype='object')
Я пытаюсь создать новый фрейм данных только с необходимыми столбцами
Сначала я создаю словарь с заголовками столбцов:
row_dict = {
'location_id': 0,
'year': 0,
'month': 0,
'day': 0,
'time_start_hour': 0,
'time_start_min': 0,
'time_end_hour': 0,
'time_end_min': 0,
'num_lanes': 0,
'is_oneway': 0,
'is_weekend': 0,
'is_holiday': 0,
'nx': 0,
'sx': 0,
'ex': 0,
'wx': 0,
'nb_r': 0,
'nb_t': 0,
'nb_l': 0,
'sb_r': 0,
'sb_t': 0,
'sb_l': 0,
'eb_r': 0,
'eb_t': 0,
'eb_l': 0,
'wb_r': 0,
'wb_t': 0,
'wb_l': 0
}
Затем я создаю пустой список, в котором буду хранить каждую строку: data_list = []
Затем я перебираю исходный фрейм данных и беру соответствующую информацию в свой словарь. Я добавляю диктонарий в список. И, наконец, я преобразую список в фрейм данных:
def getTime(time):
time = time.split(' ')[1].split('-')[0]
hour, minute, _ = time.split(':')
return float(hour), float(minute)
def isWeekend(date):
return datetime.strptime(date, '%Y-%m-%d').weekday() > 4
def isHoliday(date):
return datetime.strptime(date, '%Y-%m-%d') in holidays.CA()
for index, row in data.iterrows():
row_dict['location_id'] = row['location_id']
row_dict['year'], row_dict['month'], row_dict['day'] = row['count_date'].split('-')
row_dict['time_start_hour'], row_dict['time_start_min'] = getTime(row['time_start'])
row_dict['time_end_hour'], row_dict['time_end_min'] = getTime(row['time_end'])
row_dict['num_lanes'] = row['lanes']
row_dict['is_oneway'] = row['is_oneway']
row_dict['is_weekend'] = isWeekend(row['count_date'])
row_dict['is_holiday'] = isHoliday(row['count_date'])
row_dict['nx'] = float(row['nx_peds']) float(row['nx_bike']) float(row['nx_other'])
row_dict['sx'] = float(row['sx_peds']) float(row['sx_bike']) float(row['sx_other'])
row_dict['ex'] = float(row['ex_peds']) float(row['ex_bike']) float(row['ex_other'])
row_dict['wx'] = float(row['wx_peds']) float(row['wx_bike']) float(row['wx_other'])
row_dict['nb_r'] = float(row['nb_cars_r']) float(row['nb_truck_r']) float(row['nb_bus_r'])
row_dict['nb_t'] = float(row['nb_cars_t']) float(row['nb_truck_t']) float(row['nb_bus_t'])
row_dict['nb_l'] = float(row['nb_cars_l']) float(row['nb_truck_l']) float(row['nb_bus_l'])
row_dict['sb_r'] = float(row['sb_cars_r']) float(row['sb_truck_r']) float(row['sb_bus_r'])
row_dict['sb_t'] = float(row['sb_cars_t']) float(row['sb_truck_t']) float(row['sb_bus_t'])
row_dict['sb_l'] = float(row['sb_cars_l']) float(row['sb_truck_l']) float(row['sb_bus_l'])
row_dict['eb_r'] = float(row['eb_cars_r']) float(row['eb_truck_r']) float(row['eb_bus_r'])
row_dict['eb_t'] = float(row['eb_cars_t']) float(row['eb_truck_t']) float(row['eb_bus_t'])
row_dict['eb_l'] = float(row['eb_cars_l']) float(row['eb_truck_l']) float(row['eb_bus_l'])
row_dict['wb_r'] = float(row['wb_cars_r']) float(row['wb_truck_r']) float(row['wb_bus_r'])
row_dict['wb_t'] = float(row['wb_cars_t']) float(row['wb_truck_t']) float(row['wb_bus_t'])
row_dict['wb_l'] = float(row['wb_cars_l']) float(row['wb_truck_l']) float(row['wb_bus_l'])
data_list.append(row_dict)
finalData = pd.DataFrame(data_list)
Однако, когда я делаю это и смотрю в кадр данных, я вижу только одну строку, повторяемую 28000 раз.
Но когда я печатаю строки только с помощью итераций, он печатает все правильно:
for index, row in data.iterrows():
print(row['location_id']
Я делаю что-то не так или я не использую функцию по назначению?
Ответ №1:
Я понял, что мне нужно скопировать словарь, прежде чем добавлять его, исправить это: data_list.append(row_dict.copy())