在一个具体问题上,假设我有一个DataFrame DF
word tag count
0 a S 30
1 the S 20
2 a T 60
3 an T 5
4 the T 10
Run Code Online (Sandbox Code Playgroud)
对于每个"单词",我想找到具有最多"计数"的"标签".所以回报就像是
word tag count
1 the S 20
2 a T 60
3 an T 5
Run Code Online (Sandbox Code Playgroud)
我不关心计数列,或者订单/索引是原始的还是搞砸了.返回字典{ 'the':'S',...}就好了.
我希望我能做到
DF.groupby(['word']).agg(lambda x: x['tag'][ x['count'].argmax() ] )
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我无法访问列信息.
更抽象地说,agg(函数)中的函数看作什么?
顺便说一下,.agg()与.aggregate()相同吗?
非常感谢.
好的,快速连续的第二个R问题.
我的数据:
Timestamp St_01 St_02 ...
1 2008-02-08 00:00:00 26.020 25.840 ...
2 2008-02-08 00:10:00 25.985 25.790 ...
3 2008-02-08 00:20:00 25.930 25.765 ...
4 2008-02-08 00:30:00 25.925 25.730 ...
5 2008-02-08 00:40:00 25.975 25.695 ...
...
Run Code Online (Sandbox Code Playgroud)
基本上我通常会使用ddply和summarize计算合奏的组合(例如全年每小时的平均值).
在上面的例子中,我将创建一个类别,例如小时(例如strptime(data$Timestamp,"%H") -> data$hour,然后使用该类别ddply,比如ddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...)按每个列的类别平均.
但这里是粘性的地方.我有超过40列要处理,我不准备将它们作为参数逐个输入summarize.我曾经在shell中编写一个循环来生成这个代码,但这不是程序员如何解决问题的呢?
所以祈祷告诉,有没有人有更好的方法来实现相同的结果,但更少的击键?
我已经从人口普查局下载了美国所有城镇等的列表。这是一个随机样本:
dput(somewhere)
structure(list(state = structure(c(30L, 31L, 5L, 31L, 24L, 36L,
13L, 21L, 6L, 10L, 31L, 28L, 10L, 5L, 5L, 8L, 23L, 11L, 34L,
19L, 29L, 4L, 24L, 13L, 21L, 31L, 2L, 3L, 29L, 24L, 1L, 13L,
15L, 10L, 11L, 33L, 35L, 8L, 11L, 12L, 36L, 28L, 9L, 31L, 8L,
14L, 11L, 12L, 36L, 13L, 8L, 5L, 29L, 8L, 7L, 23L, 25L, 39L,
16L, 28L, 10L, 29L, 26L, 8L, 32L, 40L, 28L, 23L, 37L, 31L, 18L,
5L, 1L, 31L, 18L, 13L, …Run Code Online (Sandbox Code Playgroud) 在传统中plyr,返回的行会自动添加到输出中,即使它们超过了该分组的输入行数:
set.seed(1)
dat <- data.frame(x=runif(10),g=rep(letters[1:5],each=2))
> ddply( dat, .(g), function(df) df[c(1,1,1,2),] )
x g
1 0.26550866 a
2 0.26550866 a
3 0.26550866 a
4 0.37212390 a
5 0.57285336 b
6 0.57285336 b
7 0.57285336 b
8 0.90820779 b
9 0.20168193 c
10 0.20168193 c
11 0.20168193 c
12 0.89838968 c
13 0.94467527 d
14 0.94467527 d
15 0.94467527 d
16 0.66079779 d
17 0.62911404 e
18 0.62911404 e
19 0.62911404 e
20 0.06178627 e
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何做同样的事情dplyr.一些尝试:
dat …Run Code Online (Sandbox Code Playgroud) 使用dplyr,我想通过一个我可以改变的变量来总结[sic](例如在循环或apply-style命令中).
直接输入名称可以正常工作:
library(dplyr)
ChickWeight %>% group_by( Chick, Diet ) %>% summarise( mw = mean( weight ) )
Run Code Online (Sandbox Code Playgroud)
但是group_by并没有写一个字符向量,所以传递结果更难.
v <- "Diet"
ChickWeight %>% group_by( c( "Chick", v ) ) %>% summarise( mw = mean( weight ) )
## Error
Run Code Online (Sandbox Code Playgroud)
我会发布一个解决方案,但很想知道其他人如何解决这个问题.
我需要使用 选择数据框的一半groupby,其中每个组的大小未知并且可能因组而异。例如:
index summary participant_id
0 130599 17.0 13
1 130601 18.0 13
2 130603 16.0 13
3 130605 15.0 13
4 130607 15.0 13
5 130609 16.0 13
6 130611 17.0 13
7 130613 15.0 13
8 130615 17.0 13
9 130617 17.0 13
10 86789 12.0 14
11 86791 8.0 14
12 86793 21.0 14
13 86795 19.0 14
14 86797 20.0 14
15 86799 9.0 14
16 86801 10.0 14
20 107370 1.0 15
21 …Run Code Online (Sandbox Code Playgroud) 我知道这一定非常简单,但是我很难找到正确的 dplyr 命令来执行此操作。假设我想按两个变量对数据集进行分组,然后总结每行的计数。为此,我们只需:
mtcars %>% group_by(cyl, mpg) %>% summarize(Count = n())
Run Code Online (Sandbox Code Playgroud)
这将产生27行的三个变量一个数据帧cyl,mpg和Count。我接下来要做的是总结mpg三个cyl值中每一个的平均值。请记住,每行可能包含一个Count大于 1 的值,在计算平均值时必须考虑这一点。我的数据框应该有 3 行,每行 2 个变量cyl,并且Avg_mpg. 有人可以给我一个可以做到这一点的短代码夹头吗?先感谢您。
我在处理 Pandas 中的分组对象时遇到了一些麻烦。具体来说,我希望能够将列中的第一行设置为 0,同时保持其他行不变。
例如:
df = pd.DataFrame({'A': ['foo', 'bar', 'baz'] * 2,
'B': rand.randn(6),
'C': rand.rand(6) > .5})
Run Code Online (Sandbox Code Playgroud)
给我
A B C
0 foo 1.624345 False
1 bar -0.611756 True
2 baz -0.528172 False
3 foo -1.072969 True
4 bar 0.865408 False
5 baz -2.301539 True
Run Code Online (Sandbox Code Playgroud)
我将它们按 A 分组并按 B 对它们进行排序:
f = lambda x: x.sort('B', ascending=True)
sort_df = df.groupby('A',sort=False).apply(f)
Run Code Online (Sandbox Code Playgroud)
得到这个:
A B C
A
foo 3 foo -1.072969 True
0 foo 1.624345 False
bar 1 bar -0.611756 True …Run Code Online (Sandbox Code Playgroud) 注意:这个问题的确是一个重复的分离pandas数据帧字符串条目到单独的行,但这里提供的答案更通用和信息丰富,所以在所有方面到期,我选择不删除线程
我有一个'数据集',格式如下:
id | value | ...
--------|-------|------
a | 156 | ...
b,c | 457 | ...
e,g,f,h | 346 | ...
... | ... | ...
Run Code Online (Sandbox Code Playgroud)
我想通过复制每个ID的所有值来规范化它:
id | value | ...
--------|-------|------
a | 156 | ...
b | 457 | ...
c | 457 | ...
e | 346 | ...
g | 346 | ...
f | 346 | ...
h | 346 | ...
... | ... | ...
Run Code Online (Sandbox Code Playgroud)
我正在做的是应用split-apply-combine pandas使用原则,为每个组 …
我有一个由 truthIds 和 trackIds 组成的数据框:
truthId = ['A', 'A', 'B', 'B', 'C', 'C', 'A', 'C', 'B', 'A', 'A', 'C', 'C']
trackId = [1, 1, 2, 2, 3, 4, 5, 3, 2, 1, 5, 4, 6]
df1 = pd.DataFrame({'truthId': truthId, 'trackId': trackId})
trackId truthId
0 1 A
1 1 A
2 2 B
3 2 B
4 3 C
5 4 C
6 5 A
7 3 C
8 2 B
9 1 A
10 5 A
11 4 C
12 …Run Code Online (Sandbox Code Playgroud)