web-dev-qa-db-fra.com

Python: ufunc 'add' ne contenait pas de boucle avec les types de correspondance des signatures dtype ('S21') dtype ('S21') dtype ('S21')

J'ai deux dataframes, qui ont tous deux un Order ID et un date.

Je voulais ajouter un drapeau dans le premier dataframe df1: si un enregistrement avec le même order id et date est dans le cadre de données df2, puis ajoutez un Y:

[ df1['R'] = np.where(orders['key'].isin(df2['key']), 'Y', 0)]

Pour ce faire, j'allais créer une clé, qui serait la concaténation du order_id et date, mais quand j’essaie le code suivant:

df1['key']=df1['Order_ID']+'_'+df1['Date']

Je reçois cette erreur

ufunc 'add' did not contain a loop with signature matching types dtype('S21') dtype('S21') dtype('S21')

dF1 ressemble à ceci:

Date | Order_ID | other data points ... 
201751 4395674  ...
201762 3487535  ...

Ce sont les types de données:

df1.info()
RangeIndex: 157443 entries, 0 to 157442
Data columns (total 6 columns):
Order_ID                                 157429 non-null object
Date                                     157443 non-null int64
...
dtypes: float64(2), int64(2), object(2)
memory usage: 7.2+ MB

df1['Order_ID'].values
array(['782833030', '782834969', '782836416', ..., '783678018',
       '783679806', '783679874'], dtype=object)
13
jeangelj

Le problème est que vous ne pouvez pas ajouter un tableau d'objets (contenant des chaînes) à un tableau de nombres, c'est ambigu:

>>> import pandas as pd

>>> pd.Series(['abc', 'def']) + pd.Series([1, 2])
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')

Vous devez convertir explicitement votre Dates en str.

Je ne sais pas comment faire cela efficacement dans pandas mais vous pouvez utiliser:

df1['key'] = df1['Order_ID'] + '_' + df1['Date'].apply(str)  # .apply(str) is new
26
MSeifert