8
votes

Définition des valeurs de DataFrame avec l'élargissement

J'ai deux dataframes code> (avec denttimeindex code>) et souhaitez mettre à jour la première image (l'ancienne) avec des données de la deuxième image (le plus récent).

Le nouveau cadre peut contenir des données plus récentes pour les lignes déjà contenues dans le cadre ancien. Dans ce cas, les données de l'ancien cadre doivent être écrasées avec des données du nouveau cadre. De plus, le nouveau cadre peut avoir plus de colonnes / rangées, que le premier. Dans ce cas, l'ancien cadre doit être agrandi par les données dans le nouveau cadre. P>

Pandas Docs état, que p>

" Le .Loc / .ix / [] code> Les opérations peuvent effectuer l'agrandissement lors de la réglage Une clé non existante pour cet axe " p>

et p>

" A DataFrame peut être agrandi sur l'un des axes via .Loc code> " P> P> > Cependant, cela ne semble pas fonctionner et jette un KeyError code>. Exemple: P>

                     A  B  C    D
2015-07-09 12:00:00  1  1  1  NaN
2015-07-09 13:00:00  1  1  1  NaN
2015-07-09 14:00:00  2  2  2    2
2015-07-09 15:00:00  2  2  2    2
2015-07-09 16:00:00  2  2  2    2
2015-07-09 17:00:00  2  2  2    2


1 commentaires

BTW - la divergence que vous avez vue entre la documentation et la réelle KeyError renvoyée était parce que Till Pandas 0.21.0, vous pouvez indexer avec une liste comprenant Les étiquettes manquantes et existantes (c'est-à-dire qu'au moins une étiquette non manquante. ). Ce comportement est maintenant officiellement Amprété et vous ne pouvez pas inclure d'étiquettes manquantes dans une liste (une étiquette manquante Single est correcte et créera une nouvelle ligne / colonne).


3 Réponses :


6
votes

Vous pouvez utiliser la fonction combine . xxx


3 commentaires

d'accord merci. Je vais y regarder les prochains jours et accepterai votre réponse, si cela fonctionne. Cependant, je pense toujours que cela devrait être possible par simple indexation (au moins selon les documents).


@BMU Agrandissement Ne travaillez que lorsque vous ajoutez une ligne un temps. Dans votre cas, il y a plusieurs rangées.


J'ai mis à jour ma question. Il peut y avoir plus de lignes / colonnes à ajouter à la fois.



3
votes

En plus de la réponse précédente, après la réindexage, vous pouvez utiliser

# your data
# ===========================================================
df1 = pd.DataFrame(np.ones(12).reshape(4,3), columns='A B C'.split(), index=pd.date_range('2015-07-09 12:00:00', periods=4, freq='H'))
df2 = pd.DataFrame(np.ones(20).reshape(4,5)*2, columns='A B C D E'.split(), index=pd.date_range('2015-07-09 14:00:00', periods=4, freq='H'))

# processing
# =====================================================
# reindex to populate NaN
result = df2.reindex(np.union1d(df1.index, df2.index))
# fill NaN from df1
result.fillna(df1, inplace=True)

Out[3]:             
                     A  B  C   D   E
2015-07-09 12:00:00  1  1  1 NaN NaN
2015-07-09 13:00:00  1  1  1 NaN NaN
2015-07-09 14:00:00  2  2  2   2   2
2015-07-09 15:00:00  2  2  2   2   2
2015-07-09 16:00:00  2  2  2   2   2
2015-07-09 17:00:00  2  2  2   2   2


0 commentaires

14
votes

df2.combine_first (df1) code> ( Documentation ) semble servir votre besoin; Code PFB SNIPPET & SORTIE

pandas-version:  0.15.2
                     A  B  C   D
Dt                              
2015-07-09 12:00:00  1  1  1 NaN
2015-07-09 13:00:00  1  1  1 NaN
2015-07-09 14:00:00  2  2  2   2
2015-07-09 15:00:00  2  2  2   2
2015-07-09 16:00:00  2  2  2   2
2015-07-09 17:00:00  2  2  2   2


0 commentaires