J'essaie d'effectuer des opérations mathématiques simples sur les fichiers.
Les colonnes ci-dessous file_1.csv code> sont dynamiques de nature que le nombre de colonnes augmentera de temps à autre. Donc, nous ne pouvons pas avoir fixe
last_column code> p>
master_ids.csv code>: avant tout pré-traitement p>
master_count.csv code>: avant tout traitement p>
master_ids.csv code>: après un pré-traitement p>
master_count.csv code>: Sortie attendue (Ajout / Fusion) P>
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)
3 Réponses :
Ce programme suppose la mise à jour de Master_CountS.CSV et MASTER_IDS.CSV au fil du temps et doit être robuste au calendrier des mises à jour. C'est-à-dire qu'il devrait produire des résultats corrects si exécutez plusieurs fois sur la même mise à jour ou si une mise à jour est manquée.
# 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
S'il vous plaît pouvez-vous donner un peu plus de code clair pour la compréhension.
Pls Vérifiez la description comme section d'édition dans les questions.
Le premier programme ne peut pas être utilisé comme master_ids.csv code> ne change pas que cela ne cesse qu'en adversaire. La version mise à jour fonctionne simplement sans erreur et aucune sortie au Sametime.
Je vérifie le master_count.csv code> et je ne vois aucune mise à jour en ce que la sortie doit être ajoutée dans le
master_count.csv code>.
@SITZBLOGZ OK, j'ai explicitement ajouté la sortie CSV. C'est la partie la plus facile, je suppose que vous saviez déjà comment faire cela.
Je suis censé savoir avoir travaillé avec python pur et dict. Être nouveau à Pandas, je suis confronté à des problèmes. Serait une aide énorme si vous avez du temps libre pour vous aider avec cette Stackoverflow.com/Questtions/31201986/...
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
Je vois que la confusion a été la question de savoir la question que j'ai modifiée pour être plus claire.
@Sitzblogz J'ai modifié le code. Faites-moi savoir si c'est ce que vous voulez.
Les ans ressemblent à ce dont j'ai besoin mais colonne 00:30:00 et 00:45:00 code> sont dynamiques.
FILE_1 CODE> peut avoir n'importe quel fichier
ELYSERIES code> Pourriez-vous changer cette pièce.
@SITZBLOGZ J'ai modifié la pièce my_func My_Func My_func à utiliser
.iloc code> au lieu de
.loc code>.
Pourriez-vous essayer d'aider celui-ci aussi
Ma suggestion est de reformater vos données afin que ce soit comme ça: puis après votre "premier préprocession", cela deviendra comme ceci: p> . . . etc. L'idée est que vous devriez faire une seule colonne pour contenir les informations de temps, puis pour chaque préprocession, insérez les nouvelles données dans les nouvelles lignes em> et donnez à ces lignes une valeur dans la colonne TEMPS indiquant quelle heure période ils viennent. Vous pouvez ou ne pas vouloir garder les lignes initiales avec "Aucun" dans cette table; Peut-être que vous voulez simplement commencer par les valeurs "00h30:00" et conserver les "ID maîtres" dans un fichier séparé. p> Je n'ai pas totalement suivi exactement exactement comment vous informez le nouveau < Code> Ref1 Code> Les valeurs, mais le fait est que cela fait cela est susceptible de simplifier grandement votre vie. En général, au lieu d'ajouter un nombre illimité de nouvelles colonnes, il peut être beaucoup plus agréable d'ajouter une seule nouvelle colonne dont les valeurs seront alors les valeurs que vous allez utiliser comme des en-têtes pour les nouvelles colonnes ouvertes. P> p>
Je dirais que vous devriez envisager de restructurer vos données. Au lieu d'ajouter une nouvelle colonne pour chaque étape de «prétraitement», donnez à vos données un nombre fixe de colonnes, dont l'une inclut les informations de l'heure que vous utilisez actuellement comme des en-têtes des nouvelles colonnes. C'est-à-dire une colonne code> actuel_time code> et une bande de lignes avec "00:30:00" dans cette colonne, puis un tas de lignes avec "00:45:00" dans cette colonne, etc.
@Brenbarn Je ne peux pas aller chercher la reconstruction car j'ai besoin que les anciens australiens comptent trop pour un but futur.
Pas sûr de ce que vous voulez dire. Les modifications que je décris ne proviendront aucune perte d'informations, juste un format différent.
@Brenbarn sera-t-il possible pour vous de montrer au format de programme et de sortie afin que la confusion soit effacée?
@Johne Si vous avez du temps, pouvez-vous également m'aider avec cette fusion de deux programmes ou écrire un nouveau programme qui appellera les deux programmes après une heure prévue, disons toutes les 5 minutes Stackoverflow.com/questions/31314792/...
J'ai ajouté une mise à jour de la réponse, vérifiez-la. De plus, pouvez-vous vérifier votre sortie attendue pour la ligne de Chine? Je pense que j'obtiens les résultats escomptés pour toutes les lignes sauf celui-ci.
@Sitzblogz: J'ai ajouté une réponse montrant ce que je veux dire.
@SITZBLOGZ J'utilise le fichier de données brutes que vous avez fourni sur Dropbox.com/s /ak1uw5in5xq2ayq/stack_flow_bundle.zip?dl=0 , et le code que j'ai écrit semble fonctionner comme prévu. Par
pas de réponse Aucune erreur code>, voulez-vous dire que
impression (résultat) code> montre un fichier de données vide?
@Jianxunli Je pense qu'il veut une sortie explicite du fichier CSV (voir les commentaires à ma réponse)
Lorsque j'ai écrit une déclaration d'impression, il était pareil sans erreur et aucune réponse. Ensuite, je doute peut-être que j'ai écrit une mauvaise syntaxe. J'ai donc demandé à John d'inclure également la sortie du fichier CSV. Et j'avais tort avec ma syntaxe d'impression ou de mon append. Merci beaucoup à vous deux pour toute l'aide.