Заполните Pandas DataFrame, используя словарь на основе условия - PullRequest
0 голосов
/ 03 января 2019

У меня есть DataFrame

>> test = pd.DataFrame({'A': ['a', 'b', 'b', 'b'], 'B': [1, 2, 3, 4], 'C': [np.nan, np.nan, np.nan, np.nan], 'D': [np.nan, np.nan, np.nan, np.nan]})
    A   B   C   D
0   a   1       
1   b   2       
2   b   3       
3   b   4       

У меня также есть словарь, где b в input_b означает, что я изменяю только те строки, где row.A = b.

>> input_b = {2: ['Moon', 'Elephant'], 4: ['Sun', 'Mouse']}

Как заполнить DataFrame значениями из словаря, чтобы получить

    A   B   C       D
0   a   1       
1   b   2   Moon    Elephant
2   b   3       
3   b   4   Sun     Mouse

Ответы [ 4 ]

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

Использование apply

test['C'] = test['B'].map(input_b).apply(lambda x: x[0] if type(x)==list else x)
test['D'] = test['B'].map(input_b).apply(lambda x: x[1] if type(x)==list else x)

выход

   A  B     C         D
0  a  1   NaN       NaN
1  b  2  Moon  Elephant
2  b  3   NaN       NaN
3  b  4   Sun     Mouse
0 голосов
/ 03 января 2019

Использование update

test=test.set_index('B')
test.update(pd.DataFrame(input_b,index=['C','D']).T)
test=test.reset_index()
test
   B  A     C         D
0  1  a   NaN       NaN
1  2  b  Moon  Elephant
2  3  b   NaN       NaN
3  4  b   Sun     Mouse
0 голосов
/ 03 января 2019

Вы можете использовать индексирование loc после установки индекса на B:

test = test.set_index('B')
test.loc[input_b, ['C', 'D']] = list(input_b.values())
test = test.reset_index()

print(test)

   B  A     C         D
0  1  a   NaN       NaN
1  2  b  Moon  Elephant
2  3  b   NaN       NaN
3  4  b   Sun     Mouse
0 голосов
/ 03 января 2019

Возможно, это не самое эффективное решение, но, насколько я понимаю, оно выполнило свою работу:

import pandas as pd
import numpy as np

test = pd.DataFrame({'A': ['a', 'b', 'b', 'b'], 'B': [1, 2, 3, 4],
                     'C': [np.nan, np.nan, np.nan, np.nan], 
                     'D': [np.nan, np.nan, np.nan, np.nan]})


input_b = {2: ['Moon', 'Elephant'], 4: ['Sun', 'Mouse']}


for key, value in input_b.items():
    test.loc[test['B'] == key, ['C', 'D']] = value

print(test)

Выход:

   A  B     C         D
0  a  1   NaN       NaN
1  b  2  Moon  Elephant
2  b  3   NaN       NaN
3  b  4   Sun     Mouse

Это будет медленнее, если словарьinput_b становится слишком большим (слишком много строк обновляется, слишком много итераций в цикле for), но должно быть относительно быстрым с маленькими input_b даже с большими test фреймами данных.

ЭтоВ ответе также предполагается, что ключи в словаре input_b ссылаются на значения столбца B в исходном кадре данных и будут добавлять повторяющиеся значения в столбцы C и D для повторяющихся значений в столбце B..

...