我在IPython中有以下数据框,其中每一行都是一个股票:
In [261]: bdata
Out[261]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 21210 entries, 0 to 21209
Data columns:
BloombergTicker 21206 non-null values
Company 21210 non-null values
Country 21210 non-null values
MarketCap 21210 non-null values
PriceReturn 21210 non-null values
SEDOL 21210 non-null values
yearmonth 21210 non-null values
dtypes: float64(2), int64(1), object(4)
Run Code Online (Sandbox Code Playgroud)
我想应用groupby操作来计算"年度"列中每个日期的所有内容的上限加权平均回报.
这按预期工作:
In [262]: bdata.groupby("yearmonth").apply(lambda x: (x["PriceReturn"]*x["MarketCap"]/x["MarketCap"].sum()).sum())
Out[262]:
yearmonth
201204 -0.109444
201205 -0.290546
Run Code Online (Sandbox Code Playgroud)
但后来我希望将这些值"广播"回原始数据框中的索引,并将它们保存为日期匹配的常量列.
In [263]: dateGrps = bdata.groupby("yearmonth")
In [264]: dateGrps["MarketReturn"] = dateGrps.apply(lambda x: (x["PriceReturn"]*x["MarketCap"]/x["MarketCap"].sum()).sum())
---------------------------------------------------------------------------
TypeError Traceback (most recent call last) …Run Code Online (Sandbox Code Playgroud) 我有一个包含三个字符串列的数据框.我知道第3列中唯一的一个值对前两个的每个组合都有效.要清理数据,我必须按数据框前两列进行分组,并为每个组合选择第三列的最常见值.
我的代码:
import pandas as pd
from scipy import stats
source = pd.DataFrame({'Country' : ['USA', 'USA', 'Russia','USA'],
'City' : ['New-York', 'New-York', 'Sankt-Petersburg', 'New-York'],
'Short name' : ['NY','New','Spb','NY']})
print source.groupby(['Country','City']).agg(lambda x: stats.mode(x['Short name'])[0])
Run Code Online (Sandbox Code Playgroud)
最后一行代码不起作用,它说"键错误'短名称'",如果我尝试仅按城市分组,那么我得到一个AssertionError.我该怎么办呢?
我似乎无法找到关于究竟.EACHI做什么的任何文档data.table.我在文档中看到它的简要提及:
在i和设置中传递这些组时,已知组子集的聚合特别有效
by=.EACHI.何时i是data.table,DT[i,j,by=.EACHI]评估连接中每一行j的组.我们称之为每个i的分组.DTi
但是,"群体"在上下文中DT是什么意思?是否由设置的密钥确定的组DT?该组是否每个使用所有列作为键的不同行?我完全理解如何运行类似DT[i,j,by=my_grouping_variable]但是如何.EACHI工作的困惑.有人可以解释一下吗?
我试图找出一种通过使用group by函数返回结果的方法.
GROUP BY按预期工作,但我的问题是:是否可以通过忽略NULL字段组.因此它不会将NULL组合在一起,因为我仍然需要指定字段为NULL的所有行.
SELECT `table1`.*,
GROUP_CONCAT(id SEPARATOR ',') AS `children_ids`
FROM `table1`
WHERE (enabled = 1)
GROUP BY `ancestor`
Run Code Online (Sandbox Code Playgroud)
所以现在让我说我有5行,祖先字段是NULL,它返回我的行....但我想要所有5行.
您好我有以下数据帧.
Group Size
Short Small
Short Small
Moderate Medium
Moderate Small
Tall Large
Run Code Online (Sandbox Code Playgroud)
我想计算同一行在数据帧中出现的时间的频率.
Group Size Time
Short Small 2
Moderate Medium 1
Moderate Small 1
Tall Large 1
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的对象:
public class Student
{
public string Name { get; set; }
public int Grade { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想创建以下查询:按学生姓名分组成绩,按成绩对每个学生组进行排序,并按每组中的最高成绩对订单组进行排序.
所以它看起来像这样:
A 100
A 80
B 80
B 50
B 40
C 70
C 30
Run Code Online (Sandbox Code Playgroud)
我创建了以下查询:
StudentsGrades.GroupBy(student => student.Name)
.OrderBy(studentGradesGroup => studentGradesGroup.Max(student => student.Grade));
Run Code Online (Sandbox Code Playgroud)
但是返回IEnumerable IGrouping,我无法对列表进行排序,除非我在另一个foreach查询中执行此操作并使用将结果添加到其他列表AddRange.
有更漂亮的方法吗?
我正在使用该data.table软件包来加速数据集上的一些摘要统计收集.
我很好奇是否有一种方法可以按多列分组.我的数据如下:
purchaseAmt adShown url
15.54 00001 150000001
4.82 00002 150000001
157.99 05005 776300044
... ... ...
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
adShownMedian <- df1[,median(purchaseAmt),by="adShown"]
Run Code Online (Sandbox Code Playgroud)
获得每个广告的中位数.我怎么会做一些结合adShown和url?
我试过这个:
adShownMedian <- df1[,median(purchaseAmt),by=c("adShown","url")]
Run Code Online (Sandbox Code Playgroud)
但没有运气.
有什么建议?
我试图理解没有聚合函数的GROUP BY (新的oracle dbms).
它是如何运作的?
这是我尝试过的.
我将运行我的SQL的EMP表.
SELECT ename , sal
FROM emp
GROUP BY ename , sal
Run Code Online (Sandbox Code Playgroud)

SELECT ename , sal
FROM emp
GROUP BY ename;
Run Code Online (Sandbox Code Playgroud)
结果
ORA-00979:不是GROUP BY表达式
00979. 00000 - "不是GROUP BY表达式"
*原因:
*操作:行
错误:397列:16
SELECT ename , sal
FROM emp
GROUP BY sal;
Run Code Online (Sandbox Code Playgroud)
结果
ORA-00979:不是GROUP BY表达式
00979. 00000 - "不是GROUP BY表达式"
*原因:
*操作:行错误:411列:8
SELECT empno , ename , sal
FROM emp
GROUP BY sal , ename;
Run Code Online (Sandbox Code Playgroud)
结果
ORA-00979:不是GROUP BY表达式
00979. 00000 - "不是GROUP BY表达式"
*原因: …
在C#中它会是这样的:
table
.GroupBy(row => row.SomeColumn)
.Select(group => group
.OrderBy(row => row.AnotherColumn)
.First()
)
Run Code Online (Sandbox Code Playgroud)
Linq-To-Sql将其转换为以下T-SQL代码:
SELECT [t3].[AnotherColumn], [t3].[SomeColumn]
FROM (
SELECT [t0].[SomeColumn]
FROM [Table] AS [t0]
GROUP BY [t0].[SomeColumn]
) AS [t1]
OUTER APPLY (
SELECT TOP (1) [t2].[AnotherColumn], [t2].[SomeColumn]
FROM [Table] AS [t2]
WHERE (([t1].[SomeColumn] IS NULL) AND ([t2].[SomeColumn] IS NULL))
OR (([t1].[SomeColumn] IS NOT NULL) AND ([t2].[SomeColumn] IS NOT NULL)
AND ([t1].[SomeColumn] = [t2].[SomeColumn]))
ORDER BY [t2].[AnotherColumn]
) AS [t3]
ORDER BY [t3].[AnotherColumn]
Run Code Online (Sandbox Code Playgroud)
但它与MySQL不兼容.
这就是我想要做的.假设我有这张桌子:
id | record_date | other_cols
18 | 2011-04-03 | x
18 | 2012-05-19 | y
18 | 2012-08-09 | z
19 | 2009-06-01 | a
19 | 2011-04-03 | b
19 | 2011-10-25 | c
19 | 2012-08-09 | d
Run Code Online (Sandbox Code Playgroud)
对于每个id,我想选择包含最小record_date的行.所以我得到:
id | record_date | other_cols
18 | 2011-04-03 | x
19 | 2009-06-01 | a
Run Code Online (Sandbox Code Playgroud)
我在这个问题上看到的唯一解决方案是假设所有record_date条目都是不同的,但在我的数据中并非如此.使用带有两个条件的子查询和内部联接会给我一些id的重复行,这是我不想要的:
id | record_date | other_cols
18 | 2011-04-03 | x
19 | 2011-04-03 | b
19 | 2009-06-01 | a
Run Code Online (Sandbox Code Playgroud)