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.