- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个以多索引作为列的 DataFrame。我想按级别 1 分组并应用生成新列的函数。我希望将此计算列添加到每个组,因此我的数据框为每个组添加新列。
我制作了一个小的虚拟脚本和函数来复制我想做的事情。
import pandas as pd
import numpy as np
columns = [('A','julian'),('A','geoffrey'),
('B','julian'),('B','geoffrey'),
('C','julian'),('C','geoffrey')]
columns = pd.MultiIndex.from_tuples(columns)
dataframe = pd.DataFrame(data=np.random.rand(10,6),columns=columns)
def addColumn(inputDF):
group = inputDF.columns[0][1]
inputDF['sum', group] = inputDF.sum(axis=1)
return inputDF
newColumnsDataframe = dataframe.groupby(level=1, axis=1).apply(addColumn)
原始数据框如下所示:
A B C
julian geoffrey julian geoffrey julian geoffrey
0 0.204082 0.073676 0.795725 0.279702 0.258185 0.258112
1 0.263235 0.096733 0.507324 0.541198 0.525919 0.757652
2 0.196243 0.028613 0.653408 0.364365 0.174911 0.924733
3 0.528785 0.831569 0.654160 0.738029 0.940831 0.294473
4 0.853517 0.263250 0.803087 0.855270 0.701937 0.264698
5 0.239797 0.069519 0.943544 0.374411 0.189361 0.846647
6 0.980734 0.290414 0.850097 0.873785 0.903645 0.118713
7 0.591942 0.088387 0.566298 0.062140 0.568482 0.872064
8 0.818167 0.061483 0.282050 0.008404 0.449198 0.658370
9 0.217424 0.427602 0.471933 0.171458 0.390549 0.234426
生成的数据帧应如下所示(我分别构建了 sum DataFrame 并将两个数据帧连接起来以实现此结果):
A B C sum A B C \
geoffrey geoffrey geoffrey geoffrey julian julian julian
0 0.073676 0.279702 0.258112 0.611491 0.204082 0.795725 0.258185
1 0.096733 0.541198 0.757652 1.395584 0.263235 0.507324 0.525919
2 0.028613 0.364365 0.924733 1.317710 0.196243 0.653408 0.174911
3 0.831569 0.738029 0.294473 1.864071 0.528785 0.654160 0.940831
4 0.263250 0.855270 0.264698 1.383219 0.853517 0.803087 0.701937
5 0.069519 0.374411 0.846647 1.290578 0.239797 0.943544 0.189361
6 0.290414 0.873785 0.118713 1.282912 0.980734 0.850097 0.903645
7 0.088387 0.062140 0.872064 1.022590 0.591942 0.566298 0.568482
8 0.061483 0.008404 0.658370 0.728257 0.818167 0.282050 0.449198
9 0.427602 0.171458 0.234426 0.833486 0.217424 0.471933 0.390549
sum
julian
0 1.257992
1 1.296478
2 1.024561
3 2.123776
4 2.358542
5 1.372703
6 2.734476
7 1.726721
8 1.549415
9 1.079906
上面脚本中的方法基于对我来说有意义的内容以及其他人在网上写的关于做这类事情的内容。但是,newColumnsDataframe 仍然只有 6 列,而不是 8 列(为每个名称添加一列)。
我确实注意到,当我按 level=0(因此按 A、B 或 C)分组并使用转换(但不是当我在此级别上使用 apply 时),newColumnsDataframe 确实有 9 列,为添加了一个总和列每组。请看下面的代码:
import pandas as pd
import numpy as np
columns = [('A','julian'),('A','geoffrey'),
('B','julian'),('B','geoffrey'),
('C','julian'),('C','geoffrey')]
columns = pd.MultiIndex.from_tuples(columns)
dataframe = pd.DataFrame(data=np.random.rand(10,6),columns=columns)
def addColumn(inputDF):
group = inputDF.columns[0][1]
inputDF[group, 'sum'] = inputDF.sum(axis=1)
return inputDF
newColumnsDataframe = dataframe.groupby(level=0, axis=1).transform(addColumn)
我一直认为 transform 对组内的每一列起作用,而 apply 对组作为整个数据框起作用。这似乎与此矛盾。我还注意到,当我按 level=1 分组并使用 transform 而不是 apply 时,它会抛出以下错误:
ValueError: Length mismatch: Expected axis has 10 elements, new values have 6 elements
我对发生的事情感到很困惑。有谁知道为什么当我在 level=0 上使用转换和分组时这确实有效。为什么当我做同样的但是组在 level=1 时会出现错误。为什么在 EITHER 级别上分组并应用该函数不会将列添加到我的最终数据框中?提前致谢!
(PS:这不是我用来添加列的实际 DataFrame 或函数,只是一个更简单的说明)
最佳答案
有点乱,但只有一行:
(df.join(pd.concat({'sum': df.groupby(level=1, axis=1).sum()}, axis=1))
.sortlevel(level=1, axis=1))
为我制作这个:
A B C sum A B C \
geoffrey geoffrey geoffrey geoffrey julian julian julian
0 0.073676 0.279702 0.258112 0.611490 0.204082 0.795725 0.258185
1 0.096733 0.541198 0.757652 1.395583 0.263235 0.507324 0.525919
2 0.028613 0.364365 0.924733 1.317711 0.196243 0.653408 0.174911
3 0.831569 0.738029 0.294473 1.864071 0.528785 0.654160 0.940831
4 0.263250 0.855270 0.264698 1.383218 0.853517 0.803087 0.701937
5 0.069519 0.374411 0.846647 1.290577 0.239797 0.943544 0.189361
6 0.290414 0.873785 0.118713 1.282912 0.980734 0.850097 0.903645
7 0.088387 0.062140 0.872064 1.022591 0.591942 0.566298 0.568482
8 0.061483 0.008404 0.658370 0.728257 0.818167 0.282050 0.449198
9 0.427602 0.171458 0.234426 0.833486 0.217424 0.471933 0.390549
sum
julian
0 1.257992
1 1.296478
2 1.024562
3 2.123776
4 2.358541
5 1.372702
6 2.734476
7 1.726722
8 1.549415
9 1.079906
我只是说“这是我的df
,让我们先按人名分组并求和,然后将这两个求和列连接回原始df
,然后使用 sortlevel
按 level=1
和 axis=1
排序。”
因此,“sum”出现在 C
列之后的唯一原因只是因为字母 s
出现在 C
之后。如果您有一个名为 x
的列,这将不起作用。不过不确定这是否重要。
这是我用于娱乐目的的 df
:
df = pd.DataFrame({
('C', 'julian'): [0.258185, 0.52591899999999991, 0.17491099999999998, 0.94083099999999997, 0.70193700000000003, 0.189361, 0.90364500000000003, 0.56848199999999993, 0.44919799999999993, 0.39054899999999998],
('B', 'geoffrey'): [0.27970200000000001, 0.54119799999999996, 0.36436499999999999, 0.73802900000000005, 0.85527000000000009, 0.37441099999999999, 0.87378500000000003, 0.062140000000000001, 0.008404, 0.171458],
('A', 'julian'): [0.20408199999999999, 0.263235, 0.196243, 0.52878500000000006, 0.85351699999999997, 0.23979699999999998, 0.98073399999999999, 0.59194199999999997, 0.81816699999999998, 0.21742399999999998],
('B', 'julian'): [0.79572500000000002, 0.507324, 0.65340799999999999, 0.65416000000000007, 0.803087, 0.94354400000000005, 0.85009699999999988, 0.56629799999999997, 0.28205000000000002, 0.47193299999999999],
('A', 'geoffrey'): [0.073676000000000005, 0.096733, 0.028613, 0.831569, 0.26324999999999998, 0.069519000000000011, 0.29041400000000001, 0.088387000000000007, 0.061483000000000003, 0.42760200000000004],
('C', 'geoffrey'): [0.25811200000000001, 0.75765199999999999, 0.92473300000000003, 0.29447299999999998, 0.26469799999999999, 0.84664699999999993, 0.11871300000000001, 0.87206399999999995, 0.65837000000000001, 0.23442600000000002]},
columns=pd.MultiIndex.from_tuples([('A','julian'),('A','geoffrey'), ('B','julian'),('B','geoffrey'), ('C','julian'),('C','geoffrey')]))
已编辑:
这是另一种方法:
sum_columns = [('sum', name) for name in df.columns.levels[1].tolist()]
df[sum_columns] = df.groupby(axis=1, level=1).sum()
df = df.sortlevel(level=1, axis=1)
sum_columns
- 看起来像这样 [('sum', 'geoffrey'), ('sum', 'julian')]
。
df[sum_columns]
为级别 1 上的每个名称创建一个新的“总和”列。
如果希望在名称旁边显示总和列,请使用 sortlevel
。
关于python - 使用 groupby 并申请将列添加到每个组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022234/
我有以下数据框 data<-data.frame(ID=c("a", "b", "c", "d"), zeros=c(3,2,5,4), ones=c(1,1,2,1)) ID zeros on
我正在寻找以下功能: Applicative f => f (f a) -> f a Hoogle给我看join : >:t join join :: Monad m => m (m a) -> m
我需要制作一个在 HomePod 上运行的应用程序。可能吗? 最佳答案 目前无法为 HomePod 开发应用程序。 关于ios - 申请 HomePod,我们在Stack Overflow上找到一个类
我正在使用 VSTS 2008 + .Net 3.5 + C# 开发 Windows 窗体应用程序。我的困惑是,似乎 Application.Exit 不会强制应用程序终止?如果不是,我应该调用哪个方
在黎巴嫩,我们没有邮政编码。 当你申请google adsense时,你必须填写你的邮政编码。就我而言,我放了任何东西,因为我没有邮政编码。 谷歌一直拒绝我的申请,有人说是因为我住在黎巴嫩,谷歌不想与
我们使用 HTTP Auth 将 gradle 文件存储在 http 服务器上。我以为我可以通过 应用这些文件 申请自:"https://username:password@host.com/file
无法应用脉冲,在xcode6.1 osx操场上出现错误“找不到成员applyimpulse”。 码: func spawnSand() { let sand: SKSpriteNode = S
我拥有一个页面 我拥有一个应用程序 我在页面上添加了应用程序(即使它没有出现在页面的应用程序列表中:/) 是否可以使用带有我的应用程序 token 的 GraphAPI 从应用程序访问页面的完整提要和
我正在尝试使用 apply 函数在相对较小(~600 行)的数据框子集上创建一个新列,它可以工作,但速度很慢,因为 apply 函数计算量大,我无法创建这个黑盒功能更快/更简单。 但是,这个黑盒函数返
我从一家公司获得了证书,并获得了 .cer 文件,但是我无法从 .cer 文件中进行选择,但它需要一个 .pfx。有谁知道如何使用 .cer 文件签署我的 clickonce 应用程序? 最佳答案 您
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwa
我会尽量保持简短,但我需要一些建议。 我所在的团队正在并行开发适用于 android、iphone 和 wp7 的应用程序。我们有一个设计团队,可以为所有三个平台提出一个单一的设计。 最新应用程序的设
如何将 SSL HTTPS 应用于我的 PHP 登录系统。我的登录系统是基本的,下面是它的运行方式: 获取 session 和用户然后检查其是否正确。我需要某种 SSL/HTTPS 检查。 有什么例子
我正在启动一个 child 监护应用程序。这将主要涉及记录发送和接收的 SMS 消息以及记录 parent 可能感兴趣的其他 Activity 。拥有类似访问控制列表的东西也很好。 现在,据我所知:
我有一个 OTP 应用程序。到目前为止,我有两个配置文件:rebar.config 和config/vm.args,后者在前者中被引用:{vm_args, "配置/vm.args". 在较大的文档中:
这是一个足够简单的问题,令我感到惊讶的是,我找不到任何对之前问过它的人的引用。和this不一样,也不受 this discussion 的保护. 我有一个 4-d 矩阵(尺寸为 16x10x15x39
我是 Pyspark 的菜鸟,我假装玩了几个函数来更好地理解如何在更现实的场景中使用它们。有一段时间,我尝试将特定函数应用于 RDD 中的每个数字。我的问题基本上是,当我尝试打印从 RDD 中抓取的内
我已经集成了apply with monster在我的应用程序中 问题 在特别申请REQUEST交付方式后,我没有收到怪物的回复 注意 它适用于 EMAIL 传送方式 请求传递方法的脚本 如有任
这是一个非常简单的问题,我已经阅读了许多建议的解决方案,但我仍然无法让 puppet apply 导入 git::config 类。这是我的文件设置: 我通过nodes.pp导入git模块: #/et
我想知道这是否可能。 我有一个网页,我想关注表单中第一个启用的可见字段。第一个字段可以是输入字段或选择字段。我尝试过(使用 JQuery)以下格式 input,select:visible:enabl
我是一名优秀的程序员,十分优秀!