web-dev-qa-db-ja.com

Python:ufunc 'add'には、シグネチャタイプに一致するループが含まれていませんdtype( 'S21')dtype( 'S21')dtype( 'S21')

2つのデータフレームがあり、両方ともOrder IDおよびdate

最初のデータフレームにフラグを追加したかったdf1:同じorder idおよびdateはデータフレーム内にありますdf2、次にYを追加します。

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

それを達成するために、キーを作成しました。これは、order_iddateですが、次のコードを試すと:

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

このエラーが表示されます

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

df1は次のようになります。

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

これらはデータ型です:

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

問題は、オブジェクト配列(文字列を含む)を数値配列に追加できないことです。これはあいまいです。

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

Datesstrに明示的に変換する必要があります。

pandasで効率的にそれを行う方法がわかりませんが、使用できます:

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