Я пытаюсь заполнить фрейм данных недостающими данными. У меня есть два фрейма данных: df1: df1 = pd.DataFrame ({'a': ['11', '11', '11', '11', '22', '22', '43', '43'], 'x': ['d1', 'd2', 'd3', 'd4', 'd1', 'd2', 'd1', 'd3'] ...

3
GABRIEL ANDRADE QUEIROZ 19 Мар 2021 в 16:42

2 ответа

Лучший ответ

Для производительности groupby с merge не лучшая идея. Лучше создать MultiIndex со всеми возможными комбинациями для столбцов a и x и использовать DataFrame.reindex:

mux = pd.MultiIndex.from_product([df1['a'].unique(), df2['x']], names=['a','x'])
df = df1.set_index(['a','x']).reindex(mux).reset_index()
print (df)
     a   x    b
0   11  d1  1.0
1   11  d2  2.0
2   11  d3  3.0
3   11  d4  4.0
4   22  d1  5.0
5   22  d2  6.0
6   22  d3  NaN
7   22  d4  NaN
8   43  d1  7.0
9   43  d2  NaN
10  43  d3  8.0
11  43  d4  NaN

Затем, если необходимо установить a пропущенными значениями из столбца b и доставить их в конец группы с помощью a, используйте:

df = (df.assign(tmp = df['b'].isna())
        .sort_values(['a','tmp'])
        .assign(a = lambda x: x['a'].mask(x['b'].isna()))
        .drop('tmp', axis=1))

print (df)
      a   x    b
0    11  d1  1.0
1    11  d2  2.0
2    11  d3  3.0
3    11  d4  4.0
4    22  d1  5.0
5    22  d2  6.0
6   NaN  d3  NaN
7   NaN  d4  NaN
8    43  d1  7.0
10   43  d3  8.0
9   NaN  d2  NaN
11  NaN  d4  NaN
3
jezrael 19 Мар 2021 в 13:58

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

      a   x    b
0    11  d1  1.0
1    11  d2  2.0
2    11  d3  3.0
3    11  d4  4.0
4    22  d1  5.0
5    22  d2  6.0
6   NaN  d3  NaN
7   NaN  d4  NaN
8    43  d1  7.0
9   NaN  d2  NaN
10   43  d3  8.0
11  NaN  d4  NaN

Вот что я получаю из вашего кода:

import pandas as pd

df1 = pd.DataFrame({'a':['11','11','11','11','22','22','43','43'], 'x': ['d1', 'd2','d3','d4','d1','d2','d1','d3'], 'b': [1, 2,3,4,5,6,7,8]})
df2 = pd.DataFrame({'x': ['d1', 'd2','d3','d4']})

print(df1.groupby('a', as_index=False).apply(lambda d: d.merge(df2, on='x', how='right')).reset_index(drop=True))

Результат:

[Running] python -u "c:\MyProjects\~python\pandas\dframe.py"
      a   x    b
0    11  d1  1.0
1    11  d2  2.0
2    11  d3  3.0
3    11  d4  4.0
4    22  d1  5.0
5    22  d2  6.0
6   NaN  d3  NaN
7   NaN  d4  NaN
8    43  d1  7.0
9   NaN  d2  NaN
10   43  d3  8.0
11  NaN  d4  NaN
0
Bogdan Ariton 19 Мар 2021 в 14:21