- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Below is my dataframe
Txn_Key Send_Agent Send_Time Pay_Time Send_Amount \
0 NaN ANO080012 2012-05-31 02:25:00 2012-05-31 21:43:00 490.00
1 NaN AUK359401 2012-05-31 11:25:00 2012-05-31 11:57:00 616.16
2 NaN ACL000105 2012-05-31 13:07:00 2012-05-31 17:36:00 193.78
3 NaN AED420319 2012-05-31 10:50:00 2012-05-31 11:34:00 999.43
4 NaN ARA030210 2012-05-30 12:14:00 2012-05-31 04:16:00 433.29
5 NaN AJ5020114 2012-05-31 02:37:00 2012-05-31 04:31:00 378.00
6 NaN A11171047 2012-05-31 09:39:00 2012-05-31 10:08:00 865.34
Pay_Amount MTCN Send_Phone Refund_Flag time_diff
0 475.68 9323625903 97549829 NaN 0 days 19:18:00
1 600.87 3545067820 440000000000 NaN 0 days 00:32:00
2 185.21 1453132764 0511 NaN 0 days 04:29:00
3 963.04 4509062067 971566016900 NaN 0 days 00:44:00
4 423.75 6898279087 144 NaN 0 days 16:02:00
5 377.99 5170985243 963954932506 NaN 0 days 01:54:00
6 833.89 5352719100 0644798854 NaN 0 days 00:29:00
因此,当下一行的 Send_Amount 相同时,我需要一个计数。使用 lambda 进行 groupby apply 效果非常好:
txn1 = txns.loc[:,['Send_Agent','Send_Amount']]
Send_repeat_count = txn1.groupby('Send_Agent').apply(lambda txn1 : (txn1.Send_Amount.shift() == txn1.Send_Amount).cumsum()
...: )
但是类似的 lambda 函数在 groupby.agg 中不起作用。
grouped=txn.groupby('Send_Agent')
x=grouped.agg({'Send_Amount':'mean','Pay_Amount':'mean','time_diff':'min','MTCN':'size','Send_Phone':'nunique','Refund_Flag':'count','Send_Amount':'lambda txn1 : (txn1.Send_Amount.shift() == txn1.Send_Amount).cumsum()'})
AttributeError: 'Series' object has no attribute 'Send_Amount'
因此,我编写了一个单独的函数来执行相同的操作,并在我的 groupby.agg 中调用它
def repeat_count(x):
if x==x.shift():
....: cumsum()
x = grouped.agg({'Send_Amount':'mean','Pay_Amount':'mean','time_diff':'min','MTCN':'size','Send_Phone':'nunique','Refund_Flag':'count','Send_Amount':repeat_count(x)})
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
如果 cumsum 可以与 group by 一起正常工作。请应用为什么它不能在函数内部工作。
最佳答案
一般来说,Send_Agent
列将包含重复项(否则,按 Send_Agent
分组就没有意义)。此外,(x==x.shift()).cumsum()
将返回一个系列,其中的行数与每个 Send_Agent
中的重复项相同。团体。
df.groupby(...).agg(func)
要求func
返回一个标量(例如 float )。 func
不允许返回系列。 (相反,当使用 func
时,Series
可以返回 DataFrame
甚至 df.groupby(...).apply(func)
。)
如果您想计算一组中相等的相邻行的数量,您可以使用 sum()
而不是cumsum()
。例如,
import numpy as np
import pandas as pd
pd.options.display.width = 1000
nan = np.nan
txn = pd.DataFrame(
{'MTCN': [0, 9323625903, 3545067820, 1453132764, 4509062067, 6898279087, 5170985243, 5352719100],
'Pay_Amount': [1, 475.68, 600.87, 185.21, 963.04, 423.75, 377.99, 833.89],
'Pay_Time': ['2012-05-31 10:08:00', '2012-05-31 21:43:00', '2012-05-31 11:57:00', '2012-05-31 17:36:00',
'2012-05-31 11:34:00', '2012-05-31 04:16:00', '2012-05-31 04:31:00',
'2012-05-31 10:08:00'],
'Refund_Flag': [nan, nan, nan, nan, nan, nan, nan, nan],
'Send_Amount': [865.34, 490.0, 616.16, 193.78, 999.43, 433.29, 378.0, 865.34],
'Send_Phone': [3, 97549829, 440000000000, 511, 971566016900, 144, 963954932506, 644798854],
'Send_Time': ['2012-05-31 09:39:00', '2012-05-31 02:25:00', '2012-05-31 11:25:00', '2012-05-31 13:07:00',
'2012-05-31 10:50:00', '2012-05-30 12:14:00', '2012-05-31 02:37:00',
'2012-05-31 09:39:00'],
'Txn_Key': [nan, nan, nan, nan, nan, nan, nan, nan],
'Send_Agent': ['A11171047', 'ANO080012', 'AUK359401', 'ACL000105', 'AED420319',
'ARA030210', 'AJ5020114', 'A11171047'],
'time_diff': ['0 days 00:29:00', '0 days 19:18:00', '0 days 00:32:00', '0 days 04:29:00',
'0 days 00:44:00', '0 days 16:02:00', '0 days 01:54:00',
'0 days 00:29:00', ]} )
txn['time_diff'] = pd.to_timedelta(txn['time_diff'])
grouped = txn.groupby('Send_Agent')
def repeat_count(s):
return (s.shift() == s).sum()
result = grouped.agg(
{'Pay_Amount':'mean',
'time_diff':'min',
'MTCN':'size',
'Send_Phone':'nunique',
'Refund_Flag':'count',
'Send_Amount': ['mean', repeat_count]})
print(result)
产量
Refund_Flag time_diff Send_Phone MTCN Send_Amount Pay_Amount
count min nunique size mean repeat_count mean
Send_Agent
A11171047 0 1740000000000 2 2 865.34 1.0 417.445
ACL000105 0 16140000000000 1 1 193.78 0.0 185.210
AED420319 0 2640000000000 1 1 999.43 0.0 963.040
AJ5020114 0 6840000000000 1 1 378.00 0.0 377.990
ANO080012 0 69480000000000 1 1 490.00 0.0 475.680
ARA030210 0 57720000000000 1 1 433.29 0.0 423.750
AUK359401 0 1920000000000 1 1 616.16 0.0 600.870
(我添加了额外的行,以便 repeat_count
并不总是返回 0。)
当您使用DataFrame.groupby(...).apply(func)
时,传递给 func
的对象是数据框。因此,
txn1.groupby('Send_Agent').apply(
lambda txn1 : (txn1.Send_Amount.shift() == txn1.Send_Amount).cumsum())
之所以有效,是因为 txn1
里面lambda
是一个带有 Send_Amount
的 DataFrame专栏。
相反,当您使用 DataFrame.groupby(...).agg({'col': func})
时,传递给 func
的对象是系列,其值来自 col
指定的列。因此
x = grouped.agg({'Send_Amount':'mean','Pay_Amount':'mean','time_diff':'min','MTCN':'size','Send_Phone':'nunique','Refund_Flag':'count','Send_Amount':lambda txn1 : (txn1.Send_Amount.shift() == txn1.Send_Amount).cumsum()})
筹集AttributeError: 'Series' object has no attribute 'Send_Amount'
因为系列传递到 lambda
函数(并绑定(bind)到变量 txn1
)没有 Send_Amount
属性。
如果您使用类似 repeat_count
的内容:
def repeat_count(x):
if x==x.shift():
return x.cumsum()
然后if x==x.shift()
加薪
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
因为x==x.shift()
是一个系列并且 if expression
原因expression
在 bool 上下文中进行评估。即expression.__bool__()
被叫。 __bool__
必须返回 True 或 False 或引发异常。因此,对于if x==x.shift()
为了有意义,(x==x.shift()).__bool__()
必须返回 True 或 False。
Series.__bool__()
总是提出ValueError
上面是因为 Pandas(按照设计)不会猜测当 Series 中的所有值都为 True 或任何值都为 True 时,或者当系列仅仅是非空的,等等... ValueError
消息为您指明了正确的方向。通常,通过调用 (x==x.shift()).any()
明确您想要什么 bool 值来解决问题。或(x==x.shift()).all()
等
关于性能的说明:一般情况下,使用 groupby/agg
使用自定义函数的性能不如 groupby/agg
使用像 count
这样的内置方法或sum
。因此,找出一种方法(如果可能的话)用内置方法来表达计算通常是值得的。在这种情况下,您可以对整个 DataFrame 进行预备计算,然后您可以使用 groupby/agg/sum
:
txn = txn.sort_values(by='Send_Agent')
txn['repeat'] = ((txn['Send_Agent'].shift() == txn['Send_Agent'])
& (txn['Send_Agent'].shift() == txn['Send_Agent']))
grouped = txn.groupby('Send_Agent')
result = grouped.agg(
{'Pay_Amount':'mean',
'time_diff':'min',
'MTCN':'size',
'Send_Phone':'nunique',
'Refund_Flag':'count',
'Send_Amount': 'mean',
'repeat':'sum'})
print(result)
关于python Pandas 调用 groupby.agg 中的复杂函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37420042/
我之前发布过question已得到答复,但我也需要对此进行查询。我有一个包含这样数据的表结构(日期格式为 dd/mm/yyyy)。 ID Account Number Unit Ad
我正在使用 React Native Calendars 并尝试为议程组件构建我的数据。 预期的数据结构是(一个对象) { '2012-05-22': [{text: 'item 1 - any j
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
两列城镇和优先级。 我需要对表进行排序,以便优先级=1的城镇排在第一位,并且不按名称 ASC 排序,而其余城镇则按名称 ASC 排序。 我该怎么做? 谢谢;) 更新 SELECT * FROM map
我有三个表“Hardware_model”、“Warehouse”和“Brand”,并且表以这种方式一起引用:Hardware_model 仓库Hardware_model 品牌 现在我要执行以下
我有一个 MySQL 表 (tbl_filters),包含 3 列:id、cat、val id 和 val 是数字,cat 是 varchar。每个 id 有多行。 我还有另一个包含多个列的表 (tb
我想获取字段的不同值,比方说:field1...这需要一个如下查询:“从表中选择不同的(字段1)” 但是,对于某些记录,field1 为空,并且还有另一列可以替代 field1,即 field2。对于
表 1 - 用户 id username items 1 Paul 1(0020);2(0001); 表 2 - 项目 id name 1 name_here 在我的用户的项目中,我输入了 2(000
我想连接同一个表 4 次以获取列的显示方式,我不确定是否可以在 1 个 SQL 语句中完成。 tbl_用户名 id username 1 Adam 2 Bob 3 Chris tbl_机
首先,我刚刚开始自己学习JS,没有任何编程经验,这意味着我仍然要了解这种出色的编程语言的基本构建模块。 我的问题与我编写的以下代码有关: let orderCount = 0; con
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在使用 XMAPP,MySQL 正在正常运行。在 phpMyAdmin 中,我不太明白这一点,所以我尝试在 PHP 中创建一个。使用此代码,它会告诉我数据库 benutzer。尽管我在 phpMy
是否有一种高效的算法可以找到平均度最大的子图(可能是图本身)? 最佳答案 The paper "Finding a Maximum-Density Subgraph" by Andrew Goldbe
目录 1、业务背景 2、场景分析 3、流程设计 1、业务流程 2、导入流程
我有 2 个表: 1) 包含自 1900 年 1 月 1 日以来所有日期的 Masterdates 表 2) Stockdata 表,其中包含表单中的股票数据 日期、交易品种、开盘价、最高价、最低价、
我有一个非常复杂的 UI,其状态栏不断变化,其中包含多种类型的状态消息,并且 UI 具有复杂的图表控件和已加载的指示性地理 map 。 现在这些小而复杂的区域的数据上下文具有同样复杂的 ViewMod
有人可以用简单的方式向我解释为什么常量在大 O 表示法中无关紧要吗?为什么添加常量时复杂性保持不变。这不是作业问题,我只是想更好地理解这一点。让我明白这个大 O 是为了看到一个函数在接近无穷大时的行为
我在 flex 搜索索引中有以下文档。 [{ "_index": "ten2", "_type": "documents", "_id": "c323c
我有一个以零碎的方式构建的 LINQ 查询,如下所示: var initialQuery = from item in MyContext where xxx == yyy select item;
我目前正在涉足 SQL,并且希望针对我所创建的问题获得一些帮助。 为了练习一些编程,我正在制作一个 IOU 应用程序。下面是我存储的表我的借条记录(忽略一些相关栏目)。该表允许用户说“嘿,你欠我 X
我是一名优秀的程序员,十分优秀!