una nueva insertar datos data crear columna añadir agregar python csv datetime pandas multiple-columns

python - nueva - Operaciones matemáticas de la columna Pandas Sin error sin respuesta



nueva columna pandas (3)

import pandas as pd import numpy as np csv_file1 = ''/home/Jian/Downloads/stack_flow_bundle/Data_repository/master_lac_Test.csv'' csv_file2 = ''/home/Jian/Downloads/stack_flow_bundle/Data_repository/lat_lon_master.csv'' df1 = pd.read_csv(csv_file1).set_index(''Ids'') Out[53]: 00:00:00 00:30:00 00:45:00 Ids 1234 1000 500 100 8435 5243 300 200 2341 563 400 400 7352 345 500 600 # need to sort index in file 2 df2 = pd.read_csv(csv_file2).set_index(''Ids'').sort_index() Out[81]: Name lat lon 00:00:00 Ids 1234 London 40.4 10.1 500 1234 Prague 40.4 10.1 500 2341 NewYork 60.6 30.3 700 2341 Austria 60.6 30.3 700 7352 Japan 70.7 80.8 500 7352 China 70.7 80.8 500 8435 Paris 50.5 20.2 400 8435 Berlin 50.5 20.2 400 # df1 and df2 has a duplicated column 00:00:00, use df1 without 1st column temp = df2.join(df1.iloc[:, 1:]) Out[55]: Name lat lon 00:00:00 00:30:00 00:45:00 Ids 1234 London 40.4 10.1 500 500 100 1234 Prague 40.4 10.1 500 500 100 2341 NewYork 60.6 30.3 700 400 400 2341 Austria 60.6 30.3 700 400 400 7352 Japan 70.7 80.8 500 500 600 7352 China 70.7 80.8 500 500 600 8435 Paris 50.5 20.2 400 300 200 8435 Berlin 50.5 20.2 400 300 200 # do the division by number of occurence of each Ids # and add column 00:00:00 def my_func(group): num_obs = len(group) # process with column name after 00:30:00 (inclusive) group.iloc[:,4:] = (group.iloc[:,4:]/num_obs).add(group.iloc[:,3], axis=0) return group result = temp.groupby(level=''Ids'').apply(my_func) Out[104]: Name lat lon 00:00:00 00:30:00 00:45:00 Ids 1234 London 40.4 10.1 500 750 550 1234 Prague 40.4 10.1 500 750 550 2341 NewYork 60.6 30.3 700 900 900 2341 Austria 60.6 30.3 700 900 900 7352 Japan 70.7 80.8 500 750 800 7352 China 70.7 80.8 500 750 800 8435 Paris 50.5 20.2 400 550 500 8435 Berlin 50.5 20.2 400 550 500

Estoy tratando de realizar algunas operaciones matemáticas simples en los archivos.

Las columnas debajo de file_1.csv son de naturaleza dinámica, el número de columnas aumentará de vez en cuando. Entonces no podemos haber arreglado last_column

master_ids.csv : antes de cualquier preprocesamiento

Ids,ref0 #the columns increase dynamically 1234,1000 8435,5243 2341,563 7352,345

master_count.csv : antes de cualquier procesamiento

Ids,Name,lat,lon,ref1 1234,London,40.4,10.1,500 8435,Paris,50.5,20.2,400 2341,NewYork,60.6,30.3,700 7352,Japan,70.7,80.8,500 1234,Prague,40.4,10.1,100 8435,Berlin,50.5,20.2,200 2341,Austria,60.6,30.3,500 7352,China,70.7,80.8,300

master_Ids.csv : después de un preprocesamiento

Ids,ref,00:30:00 1234,1000,500 8435,5243,300 2341,563,400 7352,345,500

master_count.csv : salida esperada (Añadir / fusionar)

Ids,Name,lat,lon,ref1,00:30:00 1234,London,40.4,10.1,500,750 8435,Paris,50.5,20.2,400,550 2341,NewYork,60.6,30.3,700,900 7352,Japan,70.7,80.8,500,750 1234,Prague,40.4,10.1,100,350 8435,Berlin,50.5,20.2,200,350 2341,Austria,60.6,30.3,500,700 7352,China,70.7,80.8,300,750

Ejemplo: Ids: 1234 aparece 2 veces, por lo que el valor de ids:1234 en el current time (00:30:00) es 500 que se divide por el recuento de ids y luego se agrega a los valores correspondientes de ref1 y se crea un nuevo columna con la hora actual.

master_Ids.csv : después de otro preprocesamiento

Ids,ref,00:30:00,00:45:00 1234,1000,500,100 8435,5243,300,200 2341,563,400,400 7352,345,500,600

master_count.csv : resultado esperado después de otra ejecución (Merge / append)

Ids,Name,lat,lon,ref1,00:30:00,00:45:00 1234,London,40.4,10.1,500,750,550 8435,Paris,50.5,20.2,400,550,500 2341,NewYork,60.6,30.3,700,900,900 7352,Japan,70.7,80.8,500,750,800 1234,Prague,40.4,10.1,100,350,150 8435,Berlin,50.5,20.2,200,350,300 2341,Austria,60.6,30.3,500,700,700 7352,China,70.7,80.8,300,750,600

Así que aquí current time es 00:45:00 , y dividimos el current time value por el count de las ocurrencias de ids , y luego add a los valores ref1 correspondientes creando una nueva columna con la new current time .

Programa: Por Jianxun Li

import pandas as pd import numpy as np csv_file1 = ''/Data_repository/master_ids.csv'' csv_file2 = ''/Data_repository/master_count.csv'' df1 = pd.read_csv(csv_file1).set_index(''Ids'') # need to sort index in file 2 df2 = pd.read_csv(csv_file2).set_index(''Ids'').sort_index() # df1 and df2 has a duplicated column 00:00:00, use df1 without 1st column temp = df2.join(df1.iloc[:, 1:]) # do the division by number of occurence of each Ids # and add column any time series def my_func(group): num_obs = len(group) # process with column name after next timeseries (inclusive) group.iloc[:,4:] = (group.iloc[:,4:]/num_obs).add(group.iloc[:,3], axis=0) return group result = temp.groupby(level=''Ids'').apply(my_func)

El programa se ejecuta sin errores y sin resultados. Necesito algunas sugerencias de fijación, por favor.


Este programa asume la actualización de master_counts.csv y master_ids.csv a lo largo del tiempo y debe ser robusto al momento de las actualizaciones. Es decir, debe producir resultados correctos si se ejecuta varias veces en la misma actualización o si se pierde una actualización.

# this program updates (and replaces) the original master_counts.csv with data # in master_ids.csv, so we only want the first 5 columns when we read it in master_counts = pd.read_csv(''master_counts.csv'').iloc[:,:5] # this file is assumed to be periodically updated with the addition of new columns master_ids = pd.read_csv(''master_ids.csv'') for i in range( 2, len(master_ids.columns) ): master_counts = master_counts.merge( master_ids.iloc[:,[0,i]], on=''Ids'' ) count = master_counts.groupby(''Ids'')[''ref1''].transform(''count'') master_counts.iloc[:,-1] = master_counts[''ref1''] + master_counts.iloc[:,-1]/count master_counts.to_csv(''master_counts.csv'',index=False) %more master_counts.csv Ids,Name,lat,lon,ref1,00:30:00,00:45:00 1234,London,40.4,10.1,500,750.0,550.0 1234,Prague,40.4,10.1,100,350.0,150.0 8435,Paris,50.5,20.2,400,550.0,500.0 8435,Berlin,50.5,20.2,200,350.0,300.0 2341,NewYork,60.6,30.3,700,900.0,900.0 2341,Austria,60.6,30.3,500,700.0,700.0 7352,Japan,70.7,80.8,500,750.0,800.0 7352,China,70.7,80.8,300,550.0,600.0


Mi sugerencia es reformatear sus datos para que sea así:

Ids,ref0,current_time,ref1 1234,1000,None,None 8435,5243,None,None 2341,563,None,None 7352,345,None,None

Luego, después de su "primer preproceso", será así:

Ids,ref0,time,ref1 1234,1000,None,None 8435,5243,None,None 2341,563,None,None 7352,345,None,None 1234,1000,00:30:00,500 8435,5243,00:30:00,300 2341,563,00:30:00,400 7352,345,00:30:00,500

. . . y así. La idea es que debe hacer una sola columna para contener la información de tiempo, y luego para cada preproceso, inserte los nuevos datos en nuevas filas , y asigne a esas filas un valor en la columna de tiempo que indique de qué período de tiempo provienen. Puede o no querer mantener las filas iniciales con "Ninguno" en esta tabla; tal vez solo quiera comenzar con los valores "00:30:00" y mantener los "ID principales" en un archivo separado.

No he seguido exactamente cómo está calculando los nuevos valores ref1 , pero el hecho es que hacer esto simplificará enormemente su vida. En general, en lugar de agregar un número ilimitado de columnas nuevas, puede ser mucho más agradable agregar una sola columna cuyos valores serán los valores que usaría como encabezados para las nuevas columnas abiertas.