前提
pandas0.25.1で実行できていたコードがpandas1.0.1で正常実行できるか確認していますが
DataFrame.groupby.rolling.apply()しているコードでKeyErrorが発生しています。
pandas1.0以降に知見ある方いましたら、アドバイスいただけると助かります。
実現したいこと
以下のような発注データに対して'Order_no'でgroupby()して前回の発注データとの営業日数の差分を
'Order_date'から算出、returnする。
※pandas0.25.1では問題なく動作していた。
Order_no | Order_date | |
---|---|---|
0 | A0001 | 20200201 |
2 | A0001 | 20200203 |
1 | A0001 | 20200205 |
3 | B0001 | 20200201 |
6 | B0001 | 20200202 |
4 | B0001 | 20200203 |
5 | B0001 | 20200204 |
7 | C0001 | 20200202 |
8 | C0001 | 20200205 |
9 | C0001 | 20200205 |
10 | C0001 | 20200208 |
11 | C0001 | 20200209 |
### 発生している問題・エラーメッセージ | ||
pandas1.0.1 | ||
``` | ||
KeyError: 0 |
pandas0.25.1のFutureWarning
FutureWarning:
Currently, 'apply' passes the values as ndarrays to the applied function.
In the future, this will change to passing it as Series objects.
You need to specify 'raw=True' to keep the current behaviour,
and you can pass 'raw=False' to silence this warning
test = df.groupby(['Order_no'])['Order_date'].rolling(2).apply(calc_diff)
### 該当のソースコード ```python import pandas as pd dict1 = dict(Order_no=['A0001','A0001','A0001','B0001','B0001','B0001', 'B0001','C0001','C0001','C0001','C0001','C0001'], Order_date=[20200201,20200205,20200203,20200201,20200203, 20200204,20200202,20200202,20200205,20200205, 20200208,20200209]) df = pd.DataFrame(dict1).sort_values(['Order_no','Order_date']) #関数のif文内では実際は所定カレンダーと付け合わせて営業日数の細分をreturnします def calc_diff(d): d1, d2 = int(d[0]), int(d[1]) if d1 == d2: return 0 elif d1 < d2: return 1 diff = df.groupby(['Order_no'])['Order_date'].rolling(2).apply(calc_diff)
試したこと
groupby()を外した場合は問題なく実行できました。
グルーピングした場合に
calc_diff内のd1, d2 = int(d[0]), int(d[1])で変数に値が渡せていないようです。
FutureWarningと公式ドキュメントを参考に以下のコードも試したがダメでした。
df.groupby(['Order_no'])['Order_date'].rolling(2).apply(calc_diff,raw=True)
補足情報(FW/ツールのバージョンなど)
Python 3.7.6
pandas 1.0.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/19 00:15