Избегание 'x' не является ошибкой при переборе DataFrame - PullRequest
0 голосов
/ 17 января 2019

Я нашел решение своей проблемы, но я уверен, что есть гораздо лучший способ.Я пытаюсь перебрать DataFrame, и если каждый индекс в итерации <2 от следующего индекса, то наименьший индекс - это ключ, а количество значений <2 от каждого последующего индекса - это значения, которыедобавлен новый дикт.Извините, если это не имеет особого смысла, но по сути, если DataFrame: </p>

      v  
1    .15  
2    .31   
3    .64   
4    .15  
7    .62   
11   .12   
15   .39   
18   .54   
19   .84 

, тогда результирующий dict будет

{1:4, 18:2}

. Для этого я использовалследующий код:

f_dict = defaultdict(int)
for id1, id2 in zip(df.iterrows(),df_test[1:].iterrows()):        
    if id2[0] - id1[0] < 2:
        f_dict[x] += 1
    else:
        x = id1[0]

Однако при запуске этого, как и ожидалось, я получаю NameError: имя 'x' не определено.Таким образом, давая значение xa первого значения индекса DataFrame перед итерацией, это, кажется, решает проблему, но таким способом, который кажется неправильным.

f_dict = defaultdict(int)
x = df_test.index[0]
for id1, id2 in zip(df_test.iterrows(),df_test[1:].iterrows()):        
    if id2[0] - id1[0] < 2:
        f_dict[x] += 1
    else:
        x = id1[0]

Этот код создает дикт-

 {1:3, 18:1}

вместо

 {1:4, 18:2}

Таким образом, я перебираю новый dict, чтобы добавить 1 к каждому значению:

for key in f_dict:
    f_dict[key] += 1

И, наконец, у меня есть то, чтоЯ ищу.Я прошу прощения за неправильный способ решения этой проблемы, так как я все еще довольно плохо знаком с Python и программированием в целом.Есть ли лучший способ решить эту проблему, чтобы избежать необходимости устанавливать значение x до итерации?Так же как и не нужно потом зацикливаться на новом dict и увеличивать каждое значение на 1?Большое спасибо!

1 Ответ

0 голосов
/ 17 января 2019

Это на самом деле звучит правильно. Я не уверен, почему вы ожидали {1:4, 18:2}, потому что вы действительно сравниваете значения на (1, 2), (2, 3), (3,4)..., которые, как вы можете видеть, составляют всего 3 счета от 1 до 4. Также в вашем примере вы бы получили {1:3, 15:1}, потому что x не был бы обновлен последней итерацией.

Один из способов исправить это:

  1. Начните ваш диктант по умолчанию с 1, потому что каждый раз, когда вы подсчитываете, число значений будет по крайней мере 2, поэтому f_dict[x] += 1 всегда будет по крайней мере 2.
  2. Измените ваше предложение else на x = df2[0], чтобы оно использовало следующий индекс в качестве отправной точки.

Таким образом, изменение будет следующим:

f_dict = defaultdict(lambda: int(1))
x = df_test.index[0]
for id1, id2 in zip(df_test.iterrows(),df_test[1:].iterrows()):        
    if id2[0] - id1[0] < 2:
        f_dict[x] += 1
    else:
        x = id2[0]

f_dict
# {1:4, 18:2}

Я чувствую, что, возможно, есть лучший способ сделать это, чем iterrows(), но сейчас он ускользает от меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...