我有一个需要重复自身的数据框。
from io import StringIO
import pandas as pd
audit_trail = StringIO('''
course_id AcademicYear_to months TotalFee
260 2017 24 100
260 2018 12 140
274 2016 36 300
274 2017 24 340
274 2018 12 200
285 2017 24 300
285 2018 12 200
''')
df11 = pd.read_csv(audit_trail, sep=" " )
对于 ID 为 260 的类(class),每年有 2 个条目。 2017 年和 2018 年。我需要重复月份组的年份。 我将再获得 2 行,2018 年的第 24 个月和 2017 年的第 12 个月。最终的数据框将如下所示...
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=" " )
我尝试连接相同的数据帧两次,但这并不能解决问题。我需要更改年份,36个月,数据需要重复3次。
pd.concat([df11, df11])
按对象分组将返回年份。我只需要将每个组中的年份与原始数据框连接起来。
df11.groupby('course_id')['AcademicYear_to'].apply(list)
260 [2017, 2018]
274 [2016, 2017, 2018]
285 [2017, 2018]
如果记录与年数匹配,则可以使用简单连接。例如类(class) ID 274 有 48 个月,285 有 24 个月的持续时间,分别有 3、2 个条目。问题出在类(class) ID 260 上,该类(class)为期 24 个月,但只有 1 个条目。 加入不会返回该类(class)的第二年。
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
本例中的预期计数为
274 6
285 4
260 2
这是因为即使id 274有3年,类(class)时长也只有24个月。即使 260 只有 1 条记录,因为持续时间是 24 个月,它也应该返回 2 条记录。 (一次为当前年份,另一次为 current_year + 1)
最佳答案
IIUC我们可以merge df11
自身:
In [14]: df11.merge(df11[['course_id']], on='course_id')
Out[14]:
course_id AcademicYear_to months TotalFee
0 260 2017 24 100
1 260 2017 24 100
2 260 2018 12 140
3 260 2018 12 140
4 274 2016 36 300
5 274 2016 36 300
6 274 2016 36 300
7 274 2017 24 340
8 274 2017 24 340
9 274 2017 24 340
10 274 2018 12 200
11 274 2018 12 200
12 274 2018 12 200
13 285 2017 24 300
14 285 2017 24 300
15 285 2018 12 200
16 285 2018 12 200
关于pandas - 根据类(class)持续时间(年)重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45768170/