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)
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