pandas - 根据类(class)持续时间(年)重复行

标签 pandas

我有一个需要重复自身的数据框。

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/

相关文章:

python - 如何检查连续相同的值和值的计数同时出现 pandas

python - 用间隔之间的每日值填充索引

python - 添加新的多索引级别

python - 进行 pandas 计算的更好方法是什么?

python - 高效访问 Pandas 列中对象的属性

python - 如何找出 `DataFrame.to_numpy` 没有创建副本

python - Pandas :按均值分组后的条件切片

python - 如何更快地将 pandas.DataFrame.cumsum() 函数与过滤器一起使用?

python - Pandas:添加包含来自其他列的计算的列

python - 如何将 Pandas DataFrame 中的整数 'category' dtype 转换为 'int64'/'float64' ?