当前位置: 首页 > 面试题库 >

在熊猫中使用分组方式时,如何将“第一”和“最后”功能应用于列?

匡旭东
2023-03-14
问题内容

我有一个数据框,我想按特定列(或换句话说,按特定列中的值)对它进行分组。我可以通过以下方式进行操作: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),参见先前的编辑。

几个更新的注释:

最好使用nthgroupby方法来完成,该方法要快得多=>
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)