我有一个数据框,我想按特定列(或换句话说,按特定列中的值)对它进行分组。我可以通过以下方式进行操作:grouped = df.groupby(['ColumnName'])
。
我想象此操作的结果是一个表,其中某些单元格可以包含值集而不是单个值。为了获得一个普通的表(即每个单元格只包含一个值的表),我需要指出要使用什么函数将单元格中的值集转换为单个值。
例如,我可以用值的总和或最小值或最大值代替值集。我能做到这一点的方式如下:grouped.sum()
或grouped.min()
等等。
现在,我想对不同的列使用不同的功能。我发现可以按照以下方式进行操作:grouped.agg({'ColumnName1':sum, 'ColumnName2':min})
。
但是,由于某些原因,我无法使用first
。更详细地说,grouped.first()
有效,但grouped.agg({'ColumnName1':first, 'ColumnName2':first})
无效。因此,我得到一个NameError: NameError: name 'first' is not defined
。所以,我的问题是:为什么会发生以及如何解决这个问题。
添加
在这里,我找到了以下示例:
grouped['D'].agg({'result1' : np.sum, 'result2' : np.mean})
可能我还需要使用np
吗?但就我而言,python无法识别“ np”。我应该导入吗?
我认为问题在于,有两种first
共享名称但行为不同的方法,一种是针对groupby对象,另一种是针对Series /
DataFrame
(与时间序列有关)。
复制GROUPBY的行为first
用在数据帧的方法agg
,你可以使用iloc[0]
(它得到第一行各自组(数据帧/系列)的指数):
grouped.agg(lambda x: x.iloc[0])
例如:
In [1]: df = pd.DataFrame([[1, 2], [3, 4]])
In [2]: g = df.groupby(0)
In [3]: g.first()
Out[3]:
1
0
1 2
3 4
In [4]: g.agg(lambda x: x.iloc[0])
Out[4]:
1
0
1 2
3 4
类似地,您可以last
使用复制iloc[-1]
。
注意:这将按列运行,等等:
g.agg({1: lambda x: x.iloc[0]})
在较早版本的熊猫中,您可以使用irow方法(例如x.irow(0)
,参见先前的编辑。
几个更新的注释:
最好使用nth
groupby方法来完成,该方法要快得多=>
0.13:
g.nth(0) # first
g.nth(-1) # last
您必须 多加注意,因为默认行为是NaN行,first
并且last
忽略了NaN行…以及IIRC for DataFrame
groupbys在0.13之前被破坏了…有一个dropna
选项nth
。
您可以使用字符串而不是内置字符串(尽管IIRC pandas发现它是sum
内置字符串并适用np.sum
):
grouped['D'].agg({'result1' : "sum", 'result2' : "mean"})
问题内容: 我的数据有年龄,还有每月付款。 我正在尝试汇总付款总额,但不汇总年龄(平均有效)。 是否可以对不同的列使用不同的功能? 问题答案: 您可以将列名作为键,将想要的函数作为值传递给字典。
问题内容: 我曾经在之后进行并行化,例如: 但是,有没有人想出如何并行化返回DataFrame的函数?如预期,此代码对于失败。 问题答案: 尽管确实应该将其内置到熊猫中,但这似乎可行
问题内容: 我有一个pandas数据框,其中包含一个名为string的列。我想计算每个字符串的出现次数,然后将计数的数量除以所有计数的总和。我正在像这样在Pandas中尝试这样做: 此代码引发错误,“ DataFrame对象没有属性” size”。如何在Pandas中应用函数进行计算? 问题答案: 使用一个函数将其应用于 每个 值(而不是序列),并接受kwargs。因此,值没有方法。 也许这会工作
我想分配一个组的第一行。 输入: 我尝试了: 但是我只得到第一排。 我想要这样的输出:
问题内容: 我按照该方法在这个职位跟团模式,以取代缺失值,但遇到“IndexError:索引越界”。 我想这可能是因为某些组缺少所有值并且没有模式。有办法解决这个问题吗?谢谢! 问题答案: 鉴于确实没有任何商定的方式来处理关系,所以这非常困难。另外,它通常非常慢。这是一种“快速”的方法。我们将定义一个函数来计算每个组的模式,然后用来填充缺失的值。我们不会遇到缺少组的问题,尽管对于关系,我们可以随意
问题内容: 对于较大的数据帧(大约1到300万行),应用功能似乎工作非常缓慢。 对于我的情况,我有两种与apply函数有关的任务。 首先:应用查询字典查询 第二:与groupby一起申请 我想对于第一种情况,它可以通过数据框联接来完成,而我不确定大型数据集上这种联接的资源成本。 我的问题是: 在上述两种情况下,有什么替代方法可以适用吗? 为什么申请这么慢?对于dict查找情况,我认为应该为O(N)