私はpythonを学んでいるので、私の質問が基本的すぎる場合は失礼します。実際には、さまざまな条件に基づいて、pandasデータフレームに複数の列を作成する必要があります。これはRでdata.tableを使用して行うことができます。R-からのサンプルデータをコードの下に貼り付けています
library(data.table)
cr=4
phi=1.85
colA <- sample(1.05:20.00,1000,replace=T)
colB <- sample(1.05:20.00,1000,replace=T)
colC <- sample(1.05:20.00,1000,replace=T)
SALES <- sample(1.05:20.00,1000,replace=T)
colD <- sample(1.05:20.00,1000,replace=T)
VALUE <- sample(1.05:20.00,1000,replace=T)
df <- as.data.table(data.frame(colA,colB,colC,colD,SALES,VALUE))
df <- df[, c("colB_exp","colC_exp", "Unit_exp","Value_exp")
:= list (ifelse(!is.na(colA),pmin(colB * colA,(cr-1)*1/phi^2+cr*SALES * colA),0),
ifelse(!is.na(colA),pmin(colC * colA,(cr-1)*1/phi^2+cr*SALES * colD * colA),0),
ifelse(!is.na(colA),SALES * colA,0),
ifelse(!is.na(colA),VALUE * colA,0)
)]
ご覧のとおり、この例では4つの列を作成する必要があります(実際には、作成する必要のあるさまざまな条件の列がさらに7つありますが、例として、4つだけを検討しています)
今私はPythonで同じことをしようとしていますが、これを行う方法を得ることができません。また、新しい列を作成するためのコーディングが多すぎるように思われるため、効率的に実行しているかどうかもわかりません。以下は、Pythonで試したサンプルデータとコードです。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.uniform(0,100,size=(100, 6)), columns=list(['colA','colB','colC','colD','SALES','VALUE']))
cr=4
phi=1.85
def colB_exp(row):
return min(df['colB'] * df['colA'],(cr-1)*1/phi^2+cr* df['SALES'] * df['colA'])
df['colB_exp'] = df.apply(lambda row:colB_exp(row) if df['colA'].notnull().all() else 0,axis = 1)
しかし、TypeErrorとしてエラーが発生します。dtyped[float64]配列および[bool]型のスカラーで 'rxor'を実行できません
私のdfのデータ型を確認すると、すべての列がfloat64であり、これが実際のメインデータの場合です。
どのような問題かわからないのですが、どうすれば修正できますか。
そして、すべての列条件に対して関数を作成する必要がありますか?これを行うより良い方法はありますか?
ありがとうございました !!
あなたが避ければそれはより速くなりますapply
、あなたはこれを使ってこれを行うことができますnp.where
:
>>> df = pd.DataFrame(np.random.uniform(0,100,size=(100, 6)),
columns=list(['colA','colB','colC','colD','SALES','VALUE']))
>>> cr=4
>>> phi=1.85
>>> df['colB_exp'] = np.where(
df['colA'].notnull(),
pd.concat([
df['colB'] * df['colA'],
(cr-1)*1/phi**2+cr* df['SALES'] * df['colA']
],axis=1).min(1), 0
)
>>> df
colA colB colC ... SALES VALUE colB_exp
0 22.549300 64.278204 31.008298 ... 42.493048 59.603801 1449.428473
1 69.699479 69.173731 98.060696 ... 45.343364 40.046332 4821.373010
2 49.174025 81.000527 62.022084 ... 49.619752 18.370626 3983.121926
3 88.094696 33.193363 59.168448 ... 72.243254 8.378294 2924.159181
4 57.385150 14.326797 92.865076 ... 33.228036 55.651635 822.145427
.. ... ... ... ... ... ... ...
95 94.641142 39.684918 59.073406 ... 66.350751 38.040689 3755.825953
96 7.527524 10.376946 56.894015 ... 8.575608 71.710560 78.112711
97 12.258327 17.919200 97.053017 ... 22.476308 79.233166 219.659423
98 76.264761 60.973407 97.328900 ... 57.116251 29.756769 4650.122372
99 30.687590 77.486464 7.277809 ... 97.560641 4.835084 2377.872852
[100 rows x 7 columns]
さらに詳しく調べてdf.assign
、一度に複数の列を追加できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加