微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我认为问题在于,有两种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"})

解决方法

我有一个数据框,我想按特定列(或换句话说,按特定列中的值)对它进行分组。我可以通过以下方式进行操作: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”。我应该导入吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。