有没有办法更新pandas.pivot_表不重建它?

2024-09-27 21:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个student表,它包含student_idcourse_id和{}(10k行)。我以student_idexam_time为中心来计算一次或一天中的考试次数。我正在建立一个时间表启发式,改变一次一次考试的次数,所以我需要更新这个透视表很多次。一门课程考试时间的改变会影响原始数据帧中平均50行的数据。有没有一种方法可以在不重新计算pandas中的整个数据透视表的情况下更新得到的数据透视表,或者我应该自己跟踪数据透视表上的变化(即通过在更改的数据槽中加上或减去1)?在

编辑:下面是我如何构造透视表。我加了一列1来计算数字np.总和. 我找不到另一个运行速度更快的函数。在

sLength = len(df["student_id"])
df["ones"] = pd.Series(np.ones(sLength))
pivot_table = pd.pivot_table(df, rows = "student_id", cols = "exam_time", values = "ones", aggfunc = np.sum)

对于考试时间的变化,我写了这个(假设changed_courseold_slot移到{})

^{pr2}$

Tags: 数据iddftimenp时间tableones
1条回答
网友
1楼 · 发布于 2024-09-27 21:23:41

下面是示例代码,其思想是通过减去旧行的pivot表和添加新行的pivot表来更新total pivot表。在

所以每次更改数据时,都要调用两次pivot_table(),一次调用add(),一次调用sub()

import numpy as np
import pandas as pd

### create random data
N = 1000
a = np.random.randint(0, 100, N)
b = np.random.randint(0, 30, N)
c = np.random.randint(0, 10, N)

df = pd.DataFrame({"a":a, "b":b, "c":c})

### calculate pivot sum
res = df.pivot_table(values="c", index="a", columns="b", aggfunc="sum", fill_value=0)

### create random rows to change
M = 100
row_index = np.unique(np.random.randint(0, N, M))
old_rows = df.iloc[row_index]
M = old_rows.shape[0]
new_rows = pd.DataFrame({"a":np.random.randint(0, 100, M), 
                         "b":np.random.randint(0, 30, M),
                         "c":np.random.randint(0, 10, M)})

### update pivot table
sub_df = old_rows.pivot_table(values="c", index="a", columns="b", aggfunc="sum", fill_value=0)
add_df = new_rows.pivot_table(values="c", index="a", columns="b", aggfunc="sum", fill_value=0)
new_res = res.sub(sub_df, fill_value=0).add(add_df, fill_value=0)

### check result
df.iloc[row_index] = new_rows.values
res2 = df.pivot_table(values="c", index="a", columns="b", aggfunc="sum", fill_value=0)
print new_res.astype(int).equals(res2)

相关问题 更多 >

    热门问题