私は自分自身を繰り返す必要のあるデータフレームを持っています。コースの所要時間に応じて行を繰り返す
コースid260には、年間2つのエントリがあります。 2017年と2018年です。私は月のグループのために年を繰り返す必要があります。 私は
audit_trail = StringIO('''
course_id AcademicYear_to months TotalFee
260 2017 24 100
260 2018 24 100
260 2017 12 140
260 2018 12 140
274 2016 36 300
274 2017 36 300
274 2018 36 300
274 2016 24 340
274 2017 24 340
274 2018 24 340
274 2016 12 200
274 2017 12 200
274 2018 12 200
285 2017 24 300
285 2018 24 300
285 2017 12 200
285 2018 12 200
''')
df12 = pd.read_csv(audit_trail, sep=" " )
が、私は二度同じデータフレームをCONCATしようとした...ヶ月の最終データフレームは次のようになります12のために数ヶ月24および2017年2行以上、2018を取得しますが、それは解決しません問題。私は年を変え、36ヶ月間、データを3回繰り返す必要があります。
pd.concat([df11, df11])
オブジェクトによってグループが年を返します。私は、元のデータフレームで各グループの年に参加するだけです。
df11.groupby('course_id')['AcademicYear_to'].apply(list)
260 [2017, 2018]
274 [2016, 2017, 2018]
285 [2017, 2018]
シンプルなレコードは年の数と一致した場合に動作することができます参加します。例えば、コースID 274は48ヶ月、285は24ヶ月の継続時間を有し、それぞれ3,2エントリーがある。問題は24ヶ月のコースですが、エントリーが1つしかないコースID 260です。 に参加すると、そのコースの2年目はに戻りません。
df11=pd.read_csv('https://s3.amazonaws.com/todel162/myso.csv')
df11.course_id.value_counts()
274 3
285 2
260 1
df=df11.merge(df11[['course_id']], on='course_id')
df.course_id.value_counts()
274 9
285 4
260 1
月数も考慮するクエリを記述することはできますか?
次のクエリは、単純結合が期待される結果を返さないレコードを返します。
df11=pd.read_csv('https://s3.amazonaws.com/todel162/myso.csv')
df11['m1']=df11.groupby('course_id').course_id.transform(lambda x: x.count() * 12)
df11.query('m1 != duration_inmonths')
df11.course_id.value_counts()
274 3
285 2
260 1
df=df11.merge(df11[['course_id']], on='course_id')
df.course_id.value_counts()
274 9
285 4
260 1
この場合の予想される数は、ID 274のための3年間があっても、コースの期間はわずか24ヶ月であるため、これは
274 6
285 4
260 2
です。また、期間が24か月間であるため、260レコードが1つしかない場合でも、2レコードが返されます。 (今年は1回、もう1年は+ 1)
データが一貫している場合は動作します。私は私の質問を更新しました。 – shantanuo