【问题标题】:Extract name of sum in Python Pandas在 Python Pandas 中提取 sum 的名称
【发布时间】:2017-09-28 23:15:18
【问题描述】:

我有以下称为 df 的 DataFrame:

KEY_ID  READY   STEADY      GO
001     Yes     Maybe       123
002     No      Maybe       123
003     Yes     Sometimes   234
004     Yes     Later       234
005     No      Sometimes   345

我使用 df.count() 来查看一个值被填充了多少次,每次都是 5:

KEY_ID  5
READY   5
STEADY  5
GO      5

但我也想看看 STEADY 列中的值被使用了多少次。我用abc = df['STEADY'].value_counts() 这样做,这给了我:

Sometimes  2
Maybe      2
Later      1

通过 for 循环,我可以提取我刚刚使用 value_counts() 创建的 abc 中值的信息,如下所示:

for i in abc:
    print(i)

但是,我尝试了几种方法,包括

for i,j in enumerate(abc):
    print(i); print(j)

获取Sometimes、Maybe、Later的名称以及我不想手动输入它们。如何提取这些 value_counts() 值的名称?

【问题讨论】:

  • 您没有提供足够的信息。如果您有名为DataFrame 的变量看起来像您显示的那样,则无法获得任何看起来像您与DataFrame.sum() 的总和的东西。请注意,所有答案都假设您打算分组。请澄清,以免其他读者感到困惑。
  • @probs 您必须告诉我们您的起始数据是如何组织的。您会在 ppl 试图猜测的地方得到答案。澄清你的问题。
  • 已编辑,抱歉之前的问题不清楚

标签: python pandas for-loop


【解决方案1】:

您在寻找groupby() 吗?

import pandas as pd
lst = [['Apple', 1], ['Orange', 1], ['Apple', 2], ['Orange', 1], ['Apple', 3], ['Orange', 1]]
df = pd.DataFrame(lst)
df.columns = ['fruit', 'amount']

df.groupby('fruit').sum()

【讨论】:

  • 嗨 Jan,不,我只想提取在 Pandas 中执行“Dataframe.sum”时已经存在的“Apple”和“Orange”的名称
【解决方案2】:
import pandas as pd
rowdata = [['Apple', 1], ['Orange', 1], ['Apple', 2], ['Orange', 1], ['Apple', 3],['Orange', 1]]
df = pd.DataFrame(rowdata)
df.groupby(0).sum()

这将给出如下所示的数据框,

        1
0
Apple   6
Orange  3

但只有df.sum() 会这样,

0    AppleOrangeAppleOrangeAppleOrange
1                                    9

我希望你和第一个一样期待..

【讨论】:

    【解决方案3】:

    IIUC:

    In [339]: df
    Out[339]:
         name  val
    0   Apple    1
    1  Orange    1
    2   Apple    2
    3  Orange    1
    4   Apple    3
    5  Orange    1
    
    In [340]: df.groupby('name', as_index=False)['val'].sum()
    Out[340]:
         name  val
    0   Apple    6
    1  Orange    3
    
    In [341]: df.groupby('name', as_index=False)['val'].sum()['name']
    Out[341]:
    0     Apple
    1    Orange
    Name: name, dtype: object
    
    In [342]: df.groupby('name', as_index=False)['val'].sum()['name'].tolist()
    Out[342]: ['Apple', 'Orange']
    

    【讨论】:

      【解决方案4】:

      看来你想先用boolean indexingisin 过滤:

      print (df)
              A  B
      0   Peach  3
      1    Pear  6
      2   Apple  1
      3  Orange  1
      4   Apple  2
      5  Orange  1
      6   Apple  3
      7  Orange  1
      
      df1 = df[df['A'].isin(['Apple','Orange'])]
      print (df1)
              A  B
      2   Apple  1
      3  Orange  1
      4   Apple  2
      5  Orange  1
      6   Apple  3
      7  Orange  1
      

      然后groupbyaggregate sum:

      df2 = df1.groupby('A', as_index=False)['B'].sum()
      print (df2)
              A  B
      0   Apple  6
      1  Orange  3
      

      另一种解决方案是groupby 和聚合first,然后按列表仅选择值:

      df1 = df.groupby('A')['B'].sum()
      df2 = df1.loc[['Apple','Orange']].reset_index()
      print (df2)
              A  B
      0   Apple  6
      1  Orange  3
      

      【讨论】:

        猜你喜欢
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 2021-02-25
        • 2018-11-05
        • 2019-07-01
        • 2015-10-22
        相关资源
        最近更新 更多