【问题标题】:For loop in pandas dataframe using enumerate使用枚举在熊猫数据框中进行循环
【发布时间】:2020-08-01 06:11:54
【问题描述】:

我有一个基本数据框,它是来自不干净数据的组的结果:

 df:

Name1   Value1  Value2
A       10      30
B       40      50

我创建了一个列表如下:

Segment_list = df['Name1'].unique()
Segment_list 

array(['A', 'B'], dtype=object)

现在我想遍历列表并为每次迭代找到 Value1 中的数量,所以我正在使用:

for Segment_list in enumerate(Segment_list):
    print(df['Value1'])

但是我得到了两个值而不是一个一个。我只需要一个值进行一次迭代。这可能吗?

Expected output:

10
40

【问题讨论】:

    标签: python pandas dataframe enumerate


    【解决方案1】:

    选项 1:

    import pandas as pd
    import numpy as np
    import random
    
    np.random.seed(365)
    random.seed(365)
    rows = 25
    data = {'n': [random.choice(['A', 'B', 'C']) for _ in range(rows)],
            'v1': np.random.randint(40, size=(rows)),
            'v2': np.random.randint(40, size=(rows))}
    
    df = pd.DataFrame(data)
    
    # groupby n
    for g, d in df.groupby('n'):
    #     print(g)               # use or not, as needed
        print(d.v1.values[0])    # selects the first value of each group and prints it
    
    [out]:  # first value of each group
    5
    33
    18
    

    选项 2:

    dfg = df.groupby(['n'], as_index=False).agg({'v1': list})
    
    # display(dfg)
       n                                   v1
    0  A  [5, 26, 39, 39, 10, 12, 13, 11, 28]
    1  B      [33, 34, 28, 31, 27, 24, 36, 6]
    2  C        [18, 27, 9, 36, 35, 30, 3, 0]
    

    选项 3:

    • 如 cmets 中所述,您的数据已经是 groupby 的结果,并且每个组的列中只会有一个值。
    dfg = df.groupby('n', as_index=False).sum()
    
    # display(dfg)
    
       n   v1   v2
    0  A  183  163
    1  B  219  188
    2  C  158  189
    
    # print the value for each group in v1
    for v in dfg.v1.to_list():
        print(v)
    
    [out]:
    183
    219
    158
    

    选项 4:

    • 打印每一列的所有行
    dfg = df.groupby('n', as_index=False).sum()
    
    for col in dfg.columns[1:]:  # selects all columns after n
        for v in dfg[col].to_list():
            print(v)
    
    [out]:
    183
    219
    158
    163
    188
    189
    

    【讨论】:

      【解决方案2】:

      我同意@Trenton 的评论,即使用数据帧的全部意义在于避免像这样循环遍历它们。使用函数重新考虑这一点。然而,最接近你所写内容的方法是这样的:

      Segment_list = df['Name1'].unique()
      for Index in Segment_list:
          print(df['Value1'][df['Name1']==Index]).iloc[0]
      

      如果Name 有两个条目,则取决于您想要发生的情况(可能因为您使用.unique() 而发生这种情况,这将打印值的总和:

      df.groupby('Name1').sum()['Value1']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        相关资源
        最近更新 更多