我有一个类型的对象集合,我想转换为不同的类型.这可以通过foreach轻松完成,但我想弄清楚如何使用Linq的聚合函数来完成它.
问题是所有Aggregate示例都使用类型行string或int,它们支持'+'运算符.我希望累加器类型是一个列表,它不支持'+'语义.
这是一个简单的例子:
public class DestinationType
{
public DestinationType(int A, int B, int C) { ... }
}
var set = from item in context.Items
select new { item.A, item.B, item.C };
var newSet = set.Aggregate( new List<DestinationType>(),
(list, item) => list.Add(new DestinationType(item.A, item.B, item.C)) );
Run Code Online (Sandbox Code Playgroud)
问题是List <>.添加返回void.Aggregate的第二个参数的返回类型需要是List.
如果我有一个支持'+'类型语义的列表类型,我可以创建第二个参数
list + item
Run Code Online (Sandbox Code Playgroud)
但是我找不到任何支持这种东西的集合类型.
在Linq中,这似乎很容易实现.有办法吗?此外,如果我错过了一个更简单的方法,我也很想了解这一点.谢谢!
假设我有典型的实体汽车
class Car : Entity
{
public double MaxSpeed { get; set; }
public Color Color { get; set; }
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
这个实体,在我的域模型,将是根实体的的聚合.
现在让我们说我专攻汽车.我创造了一辆法拉利,法拉利的快乐车主喜欢用昵称来称呼他们:
class Ferrari : Car
{
public string Nickname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
假设我有另一个实体,即公司实体.它将是另一个Aggregate的根实体.有很多人在公司工作,由实体Person代表.人可能有车.但是一家公司的总裁通常都非常富有和这类人,他们有法拉利:
class President : Person
{
public Ferrari Ferrari { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我有实体总统,谁是内部的公司总结,那就是抱着法拉利,其他聚合的根实体的专业化的参考.
鉴于DDD,这是正确的吗?我是否应该将root实体本身的特化视为同一聚合的根实体?我的意思是,在我描述的领域,法拉利实体也是汽车综合体的根实体(因为法拉利也是一辆汽车)?
现在让我们说我必须 …
给出一个像这样的表
ID | Name | City
1 | X | Y
2 | Z | Y
3 | W | K
Run Code Online (Sandbox Code Playgroud)
我想产生一个像这样的结果
ID | Description
1 | Y (X, Z)
3 | K (W)
Run Code Online (Sandbox Code Playgroud)
我试过类似的东西
From C In Clients Group C By C.ID, C.City _
Into G = Group Select New With {.ID = ID, .Description = City & _
" (" & (From C In Clients Select C.Name).Aggregate(Function(X, Y) X & ", " & Y) & ")"}
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误"不支持查询运算符'聚合'." 也试过了 …
我有一个数据框df,其行与名称列重复,但不是值列的重复:
name value etc1 etc2
A 9 1 X
A 10 1 X
A 11 1 X
B 2 1 Y
C 40 1 Y
C 50 1 Y
Run Code Online (Sandbox Code Playgroud)
我需要将重复的名称聚合成一行,同时计算值列的平均值.预期产量如下:
name value etc1 etc2
A 10 1 X
B 2 1 Y
C 45 1 Y
Run Code Online (Sandbox Code Playgroud)
我试过用,df[duplicated(df$name),]但当然这并没有给我重复的意思.我想使用aggregate(),但问题是此函数的FUN部分也将适用于所有其他列,并且除了其他问题之外,它将无法计算char内容.由于所有其他列都具有与"重复"相同的内容,因此我需要将它们聚合,就像名称列一样.任何提示......?
我有一个由a组成的数据帧ID,对于组中的每个元素都是相同的,两个日期时间和这两者之间的时间间隔.其中一个日期时间对象是我的相关时间标记.现在我想获得数据帧的子集,其中包含每个组的最早条目.条目(尤其是时间间隔)需要保持不变.
我的第一种方法是根据1. ID和2.相关日期时间对帧进行排序.但是,我无法返回每个新组的第一个条目.
然后我一直在查看函数aggregate()以及ddply()函数但是我找不到两个选项,只返回第一个条目而不将聚合函数应用于时间间隔值.
是否有(简单)方法来实现这一目标?
附加:也许我不清楚添加我的aggregate()和ddply()注释.我不一定需要聚合.鉴于数据框的排序方式是每个新组的第一行是我要查找的行,只需返回一个子集,其中每一行的ID都与之前的ID不同(即每个新组的起始行).
示例数据:
structure(list(ID = c(1454L, 1322L, 1454L, 1454L, 1855L, 1669L,
1727L, 1727L, 1488L), Line = structure(c(2L, 1L, 3L, 1L, 1L,
1L, 1L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"),
Start = structure(c(1357038060, 1357221074, 1357369644, 1357834170,
1357913412, 1358151763, 1358691675, 1358789411, 1359538400
), class = c("POSIXct", "POSIXt"), tzone = ""), End = structure(c(1357110430,
1357365312, 1357564413, 1358230679, 1357978810, 1358674600,
1358853933, 1359531923, 1359568151), class = c("POSIXct",
"POSIXt"), tzone = ""), …Run Code Online (Sandbox Code Playgroud) 我汇总了我的Pandas数据帧:data.具体来说,我希望amount通过[ origin和type]的元组得到平均值和总和.为了平均和求和,我尝试了下面的numpy函数:
import numpy as np
import pandas as pd
result = data.groupby(groupbyvars).agg({'amount': [ pd.Series.sum, pd.Series.mean]}).reset_index()
Run Code Online (Sandbox Code Playgroud)
我的问题是该amount列包含NaNs,这导致result上述代码具有大量的NaN平均值和总和.
我知道这两个pd.Series.sum和pd.Series.mean具有skipna=True默认情况下,所以为什么我仍然得到NaN下面就?
我也试过这个,这显然不起作用:
data.groupby(groupbyvars).agg({'amount': [ pd.Series.sum(skipna=True), pd.Series.mean(skipna=True)]}).reset_index()
Run Code Online (Sandbox Code Playgroud)
编辑:
根据@ Korem的建议,我也尝试使用partial如下:
s_na_mean = partial(pd.Series.mean, skipna = True)
data.groupby(groupbyvars).agg({'amount': [ np.nansum, s_na_mean ]}).reset_index()
Run Code Online (Sandbox Code Playgroud)
但得到这个错误:
error: 'functools.partial' object has no attribute '__name__'
Run Code Online (Sandbox Code Playgroud) 我想分组/分组/ bin数据:
C1 C2 C3
49488.01172 0.0512 54000
268221.1563 0.0128 34399
34775.96094 0.0128 54444
13046.98047 0.07241 61000
2121699.75 0.00453 78921
71155.09375 0.0181 13794
1369809.875 0.00453 12312
750 0.2048 43451
44943.82813 0.0362 49871
85585.04688 0.0362 18947
31090.10938 0.0362 13401
68550.40625 0.0181 14345
Run Code Online (Sandbox Code Playgroud)
我想用C2值进行存储,但我希望定义存储桶,例如<= 0.005,<=.010,<=.014等.正如您所看到的,存储区间将是不均匀的.我想要每桶的C1计数以及每个桶的C1总和.
我不知道从哪里开始,因为我是一个相当新的R用户.有没有人愿意帮我弄清楚代码或指导我一个能满足我需求的例子?
编辑:添加了另一列C3.我需要每桶的C3总和以及每桶的C1和数量
使用Python 3.6和Pandas 0.19.2:
我有一个DataFrame,包含用于事务的已解析日志文件.每一行都带有时间戳,包含一个transactionid,可以表示事务的开始或结束(因此每个transactionid有1行用于start,1行用于end).
每个终点线中还可以存在其他信息.
我想通过使用startdate减去结束日期来提取每个事务的持续时间,并保留其他信息.
样本输入:
import pandas as pd
import io
df = pd.read_csv(io.StringIO('''transactionid;event;datetime;info
1;START;2017-04-01 00:00:00;
1;END;2017-04-01 00:00:02;foo1
2;START;2017-04-01 00:00:02;
3;START;2017-04-01 00:00:02;
2;END;2017-04-01 00:00:03;foo2
4;START;2017-04-01 00:00:03;
3;END;2017-04-01 00:00:03;foo3
4;END;2017-04-01 00:00:04;foo4'''), sep=';', parse_dates=['datetime'])
Run Code Online (Sandbox Code Playgroud)
这给出了以下DataFrame:
transactionid event datetime info
0 1 START 2017-04-01 00:00:00 NaN
1 1 END 2017-04-01 00:00:02 foo1
2 2 START 2017-04-01 00:00:02 NaN
3 3 START 2017-04-01 00:00:02 NaN
4 2 END 2017-04-01 00:00:03 foo2
5 4 START 2017-04-01 00:00:03 NaN
6 3 END 2017-04-01 00:00:03 …Run Code Online (Sandbox Code Playgroud) table1如下表所示
+--------+-------+-------+------------+-------+
| flight | orig | dest | passenger | bags |
+--------+-------+-------+------------+-------+
| 1111 | sfo | chi | david | 3 |
| 1112 | sfo | dal | david | 7 |
| 1112 | sfo | dal | kim | 10|
| 1113 | lax | san | ameera | 5 |
| 1114 | lax | lfr | tim | 6 |
| 1114 | lax | lfr | jake | 8 | …Run Code Online (Sandbox Code Playgroud) 可以说我在python中有以下列表.首先按装备订购,然后按日期订购:
my_list = [
{'Equip': 'A-1', 'Job': 'Job 1', 'Date': '2018-01-01'},
{'Equip': 'A-1', 'Job': 'Job 1', 'Date': '2018-01-02'},
{'Equip': 'A-1', 'Job': 'Job 1', 'Date': '2018-01-03'},
{'Equip': 'A-1', 'Job': 'Job 2', 'Date': '2018-01-04'},
{'Equip': 'A-1', 'Job': 'Job 2', 'Date': '2018-01-05'},
{'Equip': 'A-2', 'Job': 'Job 1', 'Date': '2018-01-03'},
{'Equip': 'A-2', 'Job': 'Job 3', 'Date': '2018-01-04'},
{'Equip': 'A-2', 'Job': 'Job 3', 'Date': '2018-01-05'}
]
Run Code Online (Sandbox Code Playgroud)
我想要做的是按照设备的工作不变的每一组折叠列表,并抓住设备在那里的第一个和最后一个日期.例如,这个简单的例子应该改为:
list_by_job = [
{'Equip': 'A-1', 'Job': 'Job 1', 'First': '2018-01-01', 'Last': '2018-01-03'},
{'Equip': 'A-1', 'Job': 'Job 2', 'First': …Run Code Online (Sandbox Code Playgroud)