我有3个模型:论坛,线程,帖子和我正在创建一个视图来显示论坛列表.但我也想显示每个论坛的主题数和帖子数.
然后我必须:
我在这里发现了类似的东西:Django:总结一个子子外来物的数量,但答案对我不起作用.
from django.shortcuts import render
from django.template import Context
from django.contrib.auth.decorators import login_required
from django.db.models import Count
from chinwag.models import Forum, Thread, Post
@login_required
def forums(request):
forums = Forum.objects.annotate(num_posts=Count('threads__posts')).all(
).select_related('threads__last_post')
return render(request, 'chinwag/forums.html', Context({
'forums': forums,
}))
Run Code Online (Sandbox Code Playgroud)
是否可以在1个SQL查询中执行此操作?怎么样?
示例数据框:
rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['group1', 'group2', 'group3'] * 2,
'B': rand.rand(6),
'C': rand.rand(6),
'D': rand.rand(6)})
Run Code Online (Sandbox Code Playgroud)
打印df
A B C D
0 group1 0.417022 0.186260 0.204452
1 group2 0.720324 0.345561 0.878117
2 group3 0.000114 0.396767 0.027388
3 group1 0.302333 0.538817 0.670468
4 group2 0.146756 0.419195 0.417305
5 group3 0.092339 0.685220 0.558690
Run Code Online (Sandbox Code Playgroud)
分组依据A列
group = df.groupby('A')
Run Code Online (Sandbox Code Playgroud)
使用agg返回每个组的最大值
max1 = group['B'].agg({'max' : np.max})
print max1
max
A
group1 0.417022
group2 0.720324
group3 0.092339
Run Code Online (Sandbox Code Playgroud)
但是我想保留(或取回)其他列C和D中的适当数据。这将是包含最大值的行的剩余数据。因此,返回值应为:
A B C D
group1 0.417022 …Run Code Online (Sandbox Code Playgroud) Aaa <- data.frame(amount=c(1,2,1,2,1,1,2,2,1,1,1,2,2,2,1),
card=c("a","b","c","a","c","b","a","c","b","a","b","c","a","c","a"))
aggregate(x=Aaa$amount, by=list(Aaa$card), FUN=mean)
## Group.1 x
## 1 a 1.50
## 2 b 1.25
## 3 c 1.60
tapply(Aaa$amount, Aaa$card, mean)
## a b c
## 1.50 1.25 1.60
Run Code Online (Sandbox Code Playgroud)
以上是示例代码.
看来,aggregate和tapply两者都非常方便,并执行类似的功能.
有人可以解释或举例说明他们之间的差异吗?
我想在dplyr中使用c()作为聚合函数来聚合一些字符串.我首先尝试了以下内容:
> InsectSprays$spray = as.character(InsectSprays$spray)
> dt = tbl_df(InsectSprays)
> dt %>% group_by(count) %>% summarize(c(spray))
Error: expecting a single value
Run Code Online (Sandbox Code Playgroud)
但是在aggregate()中使用c()函数有效:
> da = aggregate(spray ~ count, InsectSprays, c)
> head(da)
count spray
1 0 C, C
2 1 C, C, C, C, E, E
3 2 C, C, D, E>
Run Code Online (Sandbox Code Playgroud)
在stackoverflow中搜索暗示,使用带崩溃的paste()代替c()函数可以解决问题:
dt %>% group_by(count) %>% summarize(s=paste(spray, collapse=","))
Run Code Online (Sandbox Code Playgroud)
要么
dt %>% group_by(count) %>% summarize(paste( c(spray), collapse=","))
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么c()函数在aggregate()中工作但在dplyr summarize()中不起作用?
我想根据var_1的值知道每列的唯一值的总数.
例如:
Test <- data.frame(var_1 = c("a","a","a", "b", "b", "c", "c", "c", "c", "c"), var_2 = c("bl","bf","bl", "bl","bf","bl","bl","bf","bc", "bg" ), var_3 = c("cf","cf","eg", "cf","cf","eg","cf","dr","eg","fg"))
Run Code Online (Sandbox Code Playgroud)
我正在寻找的结果将基于var_1中的值,应该是:
var_1 var_2 var_3
a 2 2
b 2 1
c 3 4
Run Code Online (Sandbox Code Playgroud)
但是,在尝试了各种方法(包括apply和table)之后 - 聚合与我正在寻找的最接近的东西,但是这个脚本导致var_1的每个值的条目总数的摘要,但总数不是独特
agbyv1= aggregate(. ~ var_1, Test, length)
var_1 var_2 var_3
a 3 3
b 2 2
c 5 5
Run Code Online (Sandbox Code Playgroud)
我试过了
unqbyv1= aggregate(. ~ var_1, Test, length(unique(x)))
Run Code Online (Sandbox Code Playgroud)
但那没用.
任何帮助是极大的赞赏.
我有一本包含评估答案的字典,如下所示:
{
{"question1", "7"},
{"question1_comment", "pretty difficult"},
{"question2", "9"},
{"question2_comment", ""},
{"question3", "5"},
{"question3_comment", "Never on time"},
}
Run Code Online (Sandbox Code Playgroud)
但是我需要将得分项和评论项组合成一个对象,如下所示
{
{"question1", "7", "pretty difficult"},
{"question2", "9", ""},
{"question3", "5", "Never on time"},
}
Run Code Online (Sandbox Code Playgroud)
我想我需要使用Aggregate方法来解决这个问题,但我不知道从哪里开始.
我有点麻烦这个问题.
我有两个表items和stocks
items
id | name
1 | item_1
2 | item_2
stocks
id | item_id | quantity | expired_on
1 | 1 | 5 | 2015-11-12
2 | 1 | 5 | 2015-11-13
3 | 2 | 5 | 2015-11-12
4 | 2 | 5 | 2015-11-14
Run Code Online (Sandbox Code Playgroud)
我希望能够检索按日期分组的大表,并且对于每个日期,按item_id分组,并显示未过期的数量总和.
result
date | item_id | unexpired
2015-11-11 | 1 | 10
2015-11-11 | 2 | 10
2015-11-12 | 1 | 5
2015-11-12 | 2 | 5
2015-11-13 | …Run Code Online (Sandbox Code Playgroud) 我有一个data.frame ystr:
v1
1 a
2 B
3 B
4 C
5 d
6 a
7 B
8 D
Run Code Online (Sandbox Code Playgroud)
我想在CAPS中找到每组字母的开头和结尾,所以我的输出将是:
groupId startPos endPos
1 1 2 4
2 2 7 8
Run Code Online (Sandbox Code Playgroud)
通过按顺序查看每个元素并将其与之前的元素进行比较,我能够通过for循环来完成它,如下所示:
currentGroupId <-0
for (i in 1:length(ystr[,1])){
if (grepl("[[:upper:]]", ystr[i,]))
{
if (startCounter == 0)
{
currentGroupId <- currentGroupId +1
startCounter <-1
mygroups[currentGroupId,] <- c(currentGroupId, i, 0)
}
}else if (startCounter == 1){
startCounter <-0
mygroups[currentGroupId,3]<- i-1
}
}
Run Code Online (Sandbox Code Playgroud)
在R中有一种简单的方法吗?
这可能类似于Mark的开始和结束,但我无法弄清楚它在这种情况下是如何应用的.
在R中,我试图使用不同的窗口宽度对一个大矢量(高达400k元素)进行非常快速的滚动均值,然后对于每个窗口宽度,按每年的最大值汇总数据.希望下面的例子很清楚.我已经尝试了几种方法,到目前为止最快的似乎是roll_mean从包RcppRoll中使用运行平均值,并aggregate选择最大值.请注意内存需求是一个问题:下面的版本需要非常少的内存,因为它一次只进行一次滚动均值和聚合; 这是首选.
#Example data frame of 10k measurements from 2001 to 2014
n <- 100000
df <- data.frame(rawdata=rnorm(n),
year=sort(sample(2001:2014, size=n, replace=TRUE))
)
ww <- 1:120 #Vector of window widths
dfsumm <- as.data.frame(matrix(nrow=14, ncol=121))
dfsumm[,1] <- 2001:2014
colnames(dfsumm) <- c("year", paste0("D=", ww))
system.time(for (i in 1:length(ww)) {
#Do the rolling mean for this ww
df$tmp <- roll_mean(df$rawdata, ww[i], na.rm=TRUE, fill=NA)
#Aggregate maxima for each year
dfsumm[,i+1] <- aggregate(data=df, tmp ~ year, max)[,2]
}) #28s on …Run Code Online (Sandbox Code Playgroud) 给出df如下:
# group value
# 1 A 8
# 2 A 1
# 3 A 7
# 4 B 3
# 5 B 2
# 6 B 6
# 7 C 4
# 8 C 5
df <- structure(list(group = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L,
3L), .Label = c("A", "B", "C"), class = "factor"), value = c(8L,
1L, 7L, 3L, 2L, 6L, 4L, 5L)), .Names = c("group", "value"), class = "data.frame", row.names = c(NA,
-8L))
Run Code Online (Sandbox Code Playgroud)
和索引的矢量(可能与 …