Pandas или Dask dataframe, заполните значения на основе отсутствующих комбинаций переменных группировки

Кадры данных Dask и Pandas здесь могут не иметь значения, кроме отсутствия мультииндекса в Dask, но у меня есть кадр данных Dask, например:

dd = pd.DataFrame({
    'name': ['a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a2'],
    'key1': ['A',  'A',  'B',  'B',  'A' , 'A',  'B' ],
    'key2': ['C',  'D',  'C',  'D',  'C',  'D',  'C' ],
    'val1': [0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7 ],
    'val2': [0.9,  0.8,  0.7,  0.6,  0.5,  0.4,  0.3 ],
})
print(dd)

  name key1 key2  val1  val2
0   a1    A    C   0.1   0.9
1   a1    A    D   0.2   0.8
2   a1    B    C   0.3   0.7
3   a1    B    D   0.4   0.6
4   a2    A    C   0.5   0.5
5   a2    A    D   0.6   0.4
6   a2    B    C   0.7   0.3

Для 'name' = 'a2' комбинация 'key1' = 'B' и 'key2' = 'D' отсутствует. Как мне заполнить новую строку, где для «val1» и «val2» установлено значение NaN или какое-либо другое значение, без использования мультииндекса (который Dask не поддерживает)? Меня также интересует решение Pandas.

Обратите внимание, что это пример, и его необходимо выполнить для нескольких отсутствующих комбинаций клавиш.

Ожидаемый результат будет следующим:

  name key1 key2  val1  val2
0   a1    A    C   0.1   0.9
1   a1    A    D   0.2   0.8
2   a1    B    C   0.3   0.7
3   a1    B    D   0.4   0.6
4   a2    A    C   0.5   0.5
5   a2    A    D   0.6   0.4
6   a2    B    C   0.7   0.3
7   a2    B    D   nan   nan

person bill_e    schedule 24.04.2020    source источник
comment
просто для уточнения, не могли бы вы опубликовать ожидаемый результат   -  person sammywemmy    schedule 24.04.2020
comment
У меня была точно такая же проблема. Я использовал dd.compute() и использовал так же, как и в Pandas.   -  person Rajnish kumar    schedule 24.04.2020
comment
@sammywemmy отредактировано   -  person bill_e    schedule 24.04.2020
comment
прохладно. Думаю, ответа @Rajnishkumar достаточно   -  person sammywemmy    schedule 24.04.2020
comment
@sammywemmy, не так ли? Что делать, если фрейм данных не помещается в память?   -  person bill_e    schedule 24.04.2020


Ответы (1)


Вы можете создать новый фрейм данных со всеми нужными вам ключами и объединить два фрейма данных.

from itertools import product

fixed_keys = product(['a1', 'a2'], ['A', 'B'], ['C', 'D'])
key_frame = pd.DataFrame(fixed_keys, columns=['name', 'key1', 'key2'])

new_frame = pd.merge(key_frame, dd, on=['name', 'key1', 'key2'], how='left')
print(new_frame)

  name key1 key2  val1  val2
0   a1    A    C   0.1   0.9
1   a1    A    D   0.2   0.8
2   a1    B    C   0.3   0.7
3   a1    B    D   0.4   0.6
4   a2    A    C   0.5   0.5
5   a2    A    D   0.6   0.4
6   a2    B    C   0.7   0.3
7   a2    B    D   nan   nan

Если key_frame слишком большой, вы можете применить групповое применение к ключу с наиболее уникальными значениями.

fixed_keys_sub = product(['A', 'B'], ['C', 'D'])
key_frame_sub = pd.DataFrame(fixed_keys, columns=['key1', 'key2'])

def func(sub):
    sub = pd.merge(key_frame, sub, on=['key1', 'key2'], how='left')
    sub = sub.drop(columns='name')
    return sub

dd.groupby('name').apply(func).reset_index()
person Kate    schedule 24.04.2020
comment
Я попробовал, но у меня было очень большое количество уникальных значений в одном из ключей, поэтому не хватило памяти. Однако в моем случае мне нужно запустить groupby для этого ключа, поэтому я использовал ваше решение в функции применения. - person bill_e; 24.04.2020