Итерация pandas dataframe, проверка значений и создание некоторых из них

Хорошо, у меня есть (большой) фрейм данных, что-то вроде этого:

         date       time      value
0     20100201         0         1
1     20100201         6         2
2     20100201        12         3
3     20100201        18         4
4     20100202         0         5
5     20100202         6         6
6     20100202        12         7
7     20100202        18         8
8     20100203         0         9
9     20100203        18        11
10    20100204         6        12
...
8845  20160101        18      8846  

Как видите, в фрейме данных есть столбецdateколоннаtime с четырьмя часами на каждый день (00, 06, 12, 18) и колонкойvalue.

Проблема в том, что в кадре данных отсутствуют даты, в приведенном выше примере между строками 8 и 9 должны быть две дополнительные строки, соответствующие часам.6 а также12 дня20100203а также дополнительная строка между строками 9 и 10, соответствующая часу0 дня20100204.

Что мне нужно? Я хотел бы повторитьdate столбец данных, проверяя, что каждый день существует, и никто не пропал, а также, что для каждого дня есть четыре часа (00, 06, 12, 18). В случае, если во время итерации чего-то не хватает, следует добавитьименно так это место, с пропавшим без вестиdate а такжеtime а такжеNaN как ценность. Чтобы не копировать все данные снова, позвольте мне указать соответствующие аспекты, которые должны появиться в окончательной версии:

...
7     20100202        18         8
8     20100203         0         9
9     20100203         6       NaN
10    20100203        12       NaN   
11    20100203        18        11
12    20100204         0       NaN
13    20100204         6        12
...

В случае, если вы заинтересованы, здесь была задана более простая версия этой проблемы.Модульная арифметика в python для итерации кадра данных панд и любезно ответили пользователи @Alexander и @piRSquared. Спрашиваемая здесь версия является более сложной, предполагающей (я полагаю) использование datetime и timedelta и итерацию большего числа столбцов.

Извините за длинный пост и большое спасибо.

Ответы на вопрос(2)

Решение Вопроса

Ты можешь использоватьpivot для изменения формы - вы получаетеNaN в пропущенных значениях по столбцуtime, затемunstack сreset_index а такжеsort_values:

import pandas as pd

df = pd.DataFrame({'date': {0: 20100201, 1: 20100201, 2: 20100201, 3: 20100201, 4: 20100202, 5: 20100202, 6: 20100202, 7: 20100202, 8: 20100203, 9: 20100203, 10: 20100204}, 
                   'time': {0: 0, 1: 6, 2: 12, 3: 18, 4: 0, 5: 6, 6: 12, 7: 18, 8: 0, 9: 18, 10: 6},
                   'value': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 11, 10: 12}})

print (df)
        date  time  value
0   20100201     0      1
1   20100201     6      2
2   20100201    12      3
3   20100201    18      4
4   20100202     0      5
5   20100202     6      6
6   20100202    12      7
7   20100202    18      8
8   20100203     0      9
9   20100203    18     11
10  20100204     6     12
print (df.pivot(index='date', columns='time', values='value')
         .unstack()
         .reset_index(name='value')
         .sort_values('date'))

    time      date  value
0      0  20100201    1.0
4      6  20100201    2.0
8     12  20100201    3.0
12    18  20100201    4.0
1      0  20100202    5.0
5      6  20100202    6.0
9     12  20100202    7.0
13    18  20100202    8.0
2      0  20100203    9.0
6      6  20100203    NaN
10    12  20100203    NaN
14    18  20100203   11.0
3      0  20100204    NaN
7      6  20100204   12.0
11    12  20100204    NaN
15    18  20100204    NaN

Может быть, вы можетеreset_index еще раз, если вам нужно хорошоindex лайк:

print (df.pivot(index='date', columns='time', values='value')
         .unstack()
         .reset_index(name='value')
         .sort_values('date')
         .reset_index(drop=True))

    time      date  value
0      0  20100201    1.0
1      6  20100201    2.0
2     12  20100201    3.0
3     18  20100201    4.0
4      0  20100202    5.0
5      6  20100202    6.0
6     12  20100202    7.0
7     18  20100202    8.0
8      0  20100203    9.0
9      6  20100203    NaN
10    12  20100203    NaN
11    18  20100203   11.0
12     0  20100204    NaN
13     6  20100204   12.0
14    12  20100204    NaN
15    18  20100204    NaN
 David25 мая 2016 г., 15:35
Мне нужен комментарий, но он слишком длинный, поэтому я пишу его как aswer ...
 David25 мая 2016 г., 14:55
Хорошо, в этом случае должно быть возможно использоватьdrop_duplicates или что-то связанное с устранением двуличия, верно? Но я боюсь, что если я устраню дубликаты, индекс будет не 0, 1, 2 ... а что-то вроде 0, 1, 3 ... и мне нужен упорядоченный индекс, чтобы использовать ваш метод ...
 jezrael25 мая 2016 г., 14:57
Хммм, есть ли один метод - усугубить дубликаты. Дай мне время, я добавлю решение.
 jezrael25 мая 2016 г., 14:43
Значит, у вас есть дубликаты - для некоторыхdate а такжеtime у вас есть несколько значений. Это означает, например,0 20100201 0 1 и второй ряд0 20100201 0 5, Это правильно?
 David25 мая 2016 г., 14:35
Это не похоже на работу, это поднимаетValueError: Index contains duplicate entries, cannot reshape...

Хорошо, спасибо, это почти сделано, чего-то не хватает, мне нужно было бы упорядочить кадр данных, то есть для каждого дня, начиная с 20100201, первый ряд за 00 часов, второй за 06, третий для 12 - четвертое для 18, затем 20100202, начиная с 00 часов и т. д. до конечной даты в 2016 году ... Этот порядок важен, чтобы иметь возможность делать некоторую статистику с данными. Позвольте мне показать вам, что я получаю:

      time      date  value
   0     0  20100201  281.0
2224     6  20100201  278.0
4448    12  20100201  285.4
6672    18  20100201  287.6
2225     6  20100202  280.6
4449    12  20100202  287.2
6673    18  20100202  287.8
   1     0  20100202  282.4
   2     0  20100203  281.6
6674    18  20100203  287.8
4450    12  20100203  285.1
2226     6  20100203  281.0
6675    18  20100204  289.4
4451    12  20100204  286.8
   3     0  20100204  284.6
2227     6  20100204  284.2
...

(Кстати, в очень вероятном случае повторения вvalue колонка, полагаю, проблем нет, верно? Решение предназначено для одновременного устранения дубликатов в двух других столбцах, верно?)

 jezrael25 мая 2016 г., 15:44
Я не знаю, но, кажется, если использоватьsort_values как в моем решении, что это правильно? Кажется, мои данные упорядоченыdate а такжеtime, Может быть, с реальными данными вам нужно.sort_values(['date', 'time']) ?
 David25 мая 2016 г., 15:53
Да, с.sort_values(['date', 'time']) Я получаю заказанные данные. Спасибо, большое спасибо за ваше терпение и поддержку. Вы оказали неоценимую помощь. Я хочу знать столько же, сколько и ты.

Ваш ответ на вопрос