Для l oop in pandas dataframe с использованием enumerate - PullRequest
0 голосов
/ 01 августа 2020

У меня есть базовый c фрейм данных, который является результатом группировки из нечистых данных:

 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

Ответы [ 2 ]

6 голосов
/ 01 августа 2020

Вариант 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:

  • Как указано в комментариях, ваши данные уже являются результатом 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
1 голос
/ 01 августа 2020

Я согласен с комментарием @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']
...