панды перебираются в словарь и создают новый фрейм данных, который не работает

#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())