【问题标题】:How to group rows in pandas without groupby?如何在没有 groupby 的情况下对 pandas 中的行进行分组?
【发布时间】:2022-01-25 06:54:20
【问题描述】:

我有以下 Pandas DataFrame,我正在尝试根据动物的类别对动物进行分组。我知道我可以使用 groupby 来获得更快的结果。但是,我在想是否有办法通过遍历行来复制 groupby 函数。

df = pd.DataFrame([('bird', 'Falconiformes', 389.0),
('bird', 'Psittaciformes', 24.0),
('mammal', 'Carnivora', 80.2),
('mammal', 'Primates', np.nan),
('mammal', 'Carnivora', 58)],
index=['falcon', 'parrot', 'lion', 'monkey', 'leopard'],
columns=('class', 'order', 'max_speed'))

我一直在尝试使用以下代码,但它不起作用,我找不到其他方法。

birds = []
mammal = []
for i, columnclass in df.iterrows():
  if i == 'bird':
    birds.append(i)
  else:
    mammal.append(i) 
print(birds)
print(mammal)

输出应该与此代码类似。

group = df.groupby(['class']).sum()

输出[1]:

class       max_speed     
bird        413.0
mammal      138.2

【问题讨论】:

  • 展示您将如何使用 groupby 来提供我们可以比较的参考实现
  • 最后,我想根据类计算max_speed的总和。所以通过使用 groupby 我会做这样的事情 'group = df.groupby(['class']).sum()' 注意:抱歉我不能上传输出的照片
  • 您不应该将文字作为图片发布。始终对控制台输出和代码使用代码格式。

标签: python pandas dataframe


【解决方案1】:

您实际上并不需要任何循环。首先获取唯一元素的列表:

classes = df['class'].unique()

现在您可以制作字典或任何您想要的内容:

data = {cls: df['class'] == cls for cls in classes}

或单线:

data = {cls: df['class'] == cls for cls in df['class'].unique()}

但是当您可以使用groupby 时,为什么还要这样做呢?

【讨论】:

    【解决方案2】:

    数据框的iterrows 方法返回一个包含(索引,由列名索引的行数据系列)的二元组。这是熊猫documentation的一句话:

    DataFrame.iterrows()

    以 (index, Series) 对的形式迭代 DataFrame 行。

    您需要访问每一行的class 列。您可以通过在 for 循环中直接解包来做到这一点:

    birds = []
    mammal = []
    for i, (columnclass, _, _) in df.iterrows():
        if columnclass == "bird":
            birds.append(i)
        else:
            mammal.append(i)
    print(birds)
    print(mammal)
    

    【讨论】:

      【解决方案3】:

      您可以在循环中获取引用columnclass['class'] 的类名:

      birds = []
      mammal = []
      for i, columnclass in df.iterrows():
        if columnclass['class'] == 'bird':
          birds.append(i)
        else:
          mammal.append(i) 
      print(birds)
      print(mammal)
      

      输出:

      ['falcon', 'parrot']
      ['lion', 'monkey', 'leopard']
      

      【讨论】:

        【解决方案4】:

        这是一个解决方案,尽管它实际上已被 _deprecated 支持df.set_index('class').groupby(level=0).sum():

        group = df.set_index('class')['max_speed'].sum(level=0)
        

        输出:

        >>> group
        class
        bird      413.0
        mammal    138.2
        Name: max_speed, dtype: float64
        

        【讨论】:

          猜你喜欢
          • 2013-10-16
          • 1970-01-01
          • 2020-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-08
          • 2012-12-04
          • 1970-01-01
          相关资源
          最近更新 更多