les pandas fusionnent à la date comme les colonnes ne fonctionnent pas

vera

d'abord, la solution ne fonctionnait pas dans mon code pandas fusionner sur un problème de colonne de date

J'ai deux trames de données provenant du résultat de la requête mysql, les deux ont la colonne «captureDate». Dans la table mysql, le type de données est 'date'. Dans le bloc de données, le type de données est objet.

df1 ['captureDate'] données

0    2017-06-28
1    2017-06-28
2    2017-06-28
3    2017-06-28
4    2017-06-28
5    2017-06-28
6    2017-06-28
Name: captureDate, dtype: object

df2 ['captureDate'] données

0    2017-06-28
1    2017-06-28
2    2017-06-28
3    2017-06-28
4    2017-06-28
5    2017-06-28
6    2017-06-28
Name: captureDate, dtype: object

quand je compare la colonne de df1 et df2, il renvoie True

print df1['captureDate'].equals(df2['captureDate'])

mon code de fusion

inner = pd.merge(df1, df2,  on='captureDate', how='inner')

mais, le résultat est faux, il a renvoyé 49 lignes. L'information intérieure est coup:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 49 entries, 0 to 48
Data columns (total 20 columns):
rule_id_x          49 non-null int64
monitor_sites_x    49 non-null object
rule_type_x        49 non-null int64
lower_limit_x      49 non-null int64
upper_limit_x      49 non-null int64
actual_x           49 non-null int64
predict_x          49 non-null int64
captureDate        49 non-null object
deviation_x        49 non-null float32
create_time_x      49 non-null int64
actual_y           49 non-null int64
create_time_y      49 non-null int64
deviation_y        49 non-null object
id                 49 non-null int64
lower_limit_y      49 non-null int64
monitor_sites_y    49 non-null object
predict_y          49 non-null int64
rule_id_y          49 non-null object
rule_type_y        49 non-null int64
upper_limit_y      49 non-null int64

alors, pourquoi cela se produit et comment gérer ce problème?

Jezreel

Échantillon:

df1 = pd.DataFrame({'captureDate':['2017-06-22'] *3 +['2017-06-25'] * 3 +['2017-06-28'] * 2,
                   'rule_id':[40,10,20,30,70,10,60,10]})
print (df1)
  captureDate  rule_id
0  2017-06-22       40
1  2017-06-22       10
2  2017-06-22       20
3  2017-06-25       30
4  2017-06-25       70
5  2017-06-25       10
6  2017-06-28       60
7  2017-06-28       10
df2 = pd.DataFrame({'captureDate':['2017-06-22'] *3 +['2017-06-25'] * 3 +['2017-06-28'] * 2,
                   'rule_id':[1,2,3,4,5,6,7,8]})
print (df2)
  captureDate  rule_id
0  2017-06-22        1
1  2017-06-22        2
2  2017-06-22        3
3  2017-06-25        4
4  2017-06-25        5
5  2017-06-25        6
6  2017-06-28        7
7  2017-06-28        8

Commencez par convertir en datetime par to_datetime:

df1['captureDate'] = pd.to_datetime(df1['captureDate'])
df2['captureDate']  = pd.to_datetime(df2['captureDate'])

Le problème sont les doublons dans les deux colonnes:

print (df1['captureDate'].equals(df2['captureDate']))
True

inner = pd.merge(df1, df2,  on='captureDate', how='inner')
print (inner)
   captureDate  rule_id_x  rule_id_y
0   2017-06-22         40          1
1   2017-06-22         40          2
2   2017-06-22         40          3
3   2017-06-22         10          1
4   2017-06-22         10          2
5   2017-06-22         10          3
6   2017-06-22         20          1
7   2017-06-22         20          2
8   2017-06-22         20          3
9   2017-06-25         30          4
10  2017-06-25         30          5
11  2017-06-25         30          6
12  2017-06-25         70          4
13  2017-06-25         70          5
14  2017-06-25         70          6
15  2017-06-25         10          4
16  2017-06-25         10          5
17  2017-06-25         10          6
18  2017-06-28         60          7
19  2017-06-28         60          8
20  2017-06-28         10          7
21  2017-06-28         10          8

Solutions possibles

Utiliser concatavec set_index, puis aplatir MultiIndexpar mapet join:

df3 = pd.concat([df1.set_index('captureDate'), 
                 df2.set_index('captureDate')], 
                 axis=1, 
                 keys=('a', 'b'))
df3.columns = df3.columns.map('_'.join)
print (df3)
             a_rule_id  b_rule_id
captureDate                      
2017-06-22          40          1
2017-06-22          10          2
2017-06-22          20          3
2017-06-25          30          4
2017-06-25          70          5
2017-06-25          10          6
2017-06-28          60          7
2017-06-28          10          8

Ou supprimez les doublons drop_duplicatesou l'agrégation de données captureDatedans les deux df:

df1 = df1.drop_duplicates('captureDate')
df2 = df2.drop_duplicates('captureDate')
print (df1)
  captureDate  rule_id
0  2017-06-22       40
3  2017-06-25       30
6  2017-06-28       60

print (df2)
  captureDate  rule_id
0  2017-06-22        1
3  2017-06-25        4
6  2017-06-28        7

inner = pd.merge(df1, df2,  on='captureDate', how='inner')
print (inner)
  captureDate  rule_id_x  rule_id_y
0  2017-06-22         40          1
1  2017-06-25         30          4
2  2017-06-28         60          7

EDIT1:

Vous pouvez utiliser cumcountpour compter les doublons par colonne captureDate, puis merge. Dernière suppression de la colonne d'assistance newpar drop:

df1 = pd.DataFrame({'captureDate':['2017-06-22']* 3 + ['2017-06-25']* 3 + ['2017-06-28'] * 2,
                   'rule_id':[40,10,20,30,70,10,60,10]})

df2 = pd.DataFrame({'captureDate':['2017-06-22'] * 3 + ['2017-06-25'] * 3,
                   'rule_id':[1,2,3,4,5,6]})


df1['new'] = df1.groupby('captureDate').cumcount()
df2['new'] = df2.groupby('captureDate').cumcount()
print (df1)
  captureDate  rule_id  new
0  2017-06-22       40    0
1  2017-06-22       10    1
2  2017-06-22       20    2
3  2017-06-25       30    0
4  2017-06-25       70    1
5  2017-06-25       10    2
6  2017-06-28       60    0
7  2017-06-28       10    1

print (df2)
  captureDate  rule_id  new
0  2017-06-22        1    0
1  2017-06-22        2    1
2  2017-06-22        3    2
3  2017-06-25        4    0
4  2017-06-25        5    1
5  2017-06-25        6    2

df3 = pd.merge(df1, df2, on=['captureDate','new']).drop('new', axis=1)
print (df3)
  captureDate  rule_id_x  rule_id_y
0  2017-06-22         40          1
1  2017-06-22         10          2
2  2017-06-22         20          3
3  2017-06-25         30          4
4  2017-06-25         70          5
5  2017-06-25         10          6

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Les pandas fusionnent ne conservant pas la colonne «On»

Pandas: les dataframes ne fusionnent pas

Les pandas fusionnent sans dupliquer les colonnes

Les pandas fusionnent deux dataframes en prenant la moyenne entre les colonnes

les colonnes multiples ne fonctionnent pas dans la liste horizontale des méga menus

Les liens ne fonctionnent pas si la page a été demandée avec 'null' comme origine

La navigation React 6 et les clics ne fonctionnent pas comme prévu

Les hachages Perl ne fonctionnent pas comme prévu

Pourquoi les conditions SQL (pas dans, pas comme,! =) Ne fonctionnent pas sur la valeur varchar de la table

les pandas fusionnent les lignes en fonction de la même date

Les pandas fusionnent sur une partie de deux colonnes

Les traductions ne fonctionnent pas

les pandas fusionnent les dataframes à l'heure la plus proche

Les matrices rmarkdown ne fonctionnent pas comme prévu ou ne s'affichent pas dans rstudio

les gestionnaires d'événements fonctionnent comme onload et onLocationfound ne fonctionnent pas la fonction n'est pas exécutée

Les liens dans la barre de navigation ne fonctionnent pas

Les liaisons TypeScript pour la classe ne fonctionnent pas?

Les données Foreach ne fonctionnent pas dans la variable

Les boutons de la calculatrice ne fonctionnent pas correctement java

Les fonctions Keyup ne fonctionnent pas sur la recherche Datatable

Les tests Django ne fonctionnent pas mais les vues fonctionnent

Les pandas fusionnent sur certaines colonnes; pour certaines autres colonnes prendre à gauche sinon NaN

Les pandas ont récupéré des données qui ne fonctionnent pas dans les pandas

Les alertes d'amorçage Django ne fonctionnent pas comme prévu

Les associations en séquelle ne fonctionnent pas comme prévu

Les relations Vapor 3, Fluent 3 et Many-to-Many ne fonctionnent pas comme prévu

Les composants de mise en page (tiroir, barre d'outils,…) ne fonctionnent pas comme composant

les règles de sécurité Firebase ne fonctionnent pas comme prévu

Les Shadow Maps en cascade ne fonctionnent pas comme prévu