9
votes

Pandas colonne Opérations mathématiques Pas d'erreur Pas de réponse

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> xxx pré>

master_count.csv code>: avant tout traitement p> xxx pré>

master_ids.csv code>: après un pré-traitement p> xxx pré>

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)


10 commentaires

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 actuel_time 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 , voulez-vous dire que impression (résultat) 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.


3 Réponses :


3
votes

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


6 commentaires

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 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 et je ne vois aucune mise à jour en ce que la sortie doit être ajoutée dans le master_count.csv .


@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/...



2
votes
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

5 commentaires

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 sont dynamiques. FILE_1 peut avoir n'importe quel fichier ELYSERIES Pourriez-vous changer cette pièce.


@SITZBLOGZ J'ai modifié la pièce my_func .iloc au lieu de .loc .


Pourriez-vous essayer d'aider celui-ci aussi Stackoverflow.com/Questtions/31201986/...



2
votes

Ma suggestion est de reformater vos données afin que ce soit comme ça: xxx

puis après votre "premier préprocession", cela deviendra comme ceci: xxx

. . . 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 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é.

Je n'ai pas totalement suivi exactement exactement comment vous informez le nouveau < Code> Ref1 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.


0 commentaires