Условное объединение данных в существующий столбец данных pandas - PullRequest
1 голос
/ 24 апреля 2020

У меня есть следующие данные:

one_dict = {0: "zero", 1: "one", 2: "two", 3: "three", 4: "four"}
two_dict = {0: "light", 1: "calc", 2: "line", 3: "blur", 4: "color"}
np.random.seed(2)
n = 15
a_df = pd.DataFrame(dict(a=np.random.randint(0, 4, n), b=np.random.randint(0, 3, n)))
a_df["c"] = np.nan
a_df = a_df.sort_values("b").reset_index(drop=True)

где фрейм данных выглядит так:

In [45]: a_df
Out[45]:
    a  b   c
0   3  0 NaN
1   1  0 NaN
2   0  0 NaN
3   2  0 NaN
4   3  0 NaN
5   1  0 NaN
6   2  1 NaN
7   2  1 NaN
8   3  1 NaN
9   0  2 NaN
10  3  2 NaN
11  3  2 NaN
12  0  2 NaN
13  3  2 NaN
14  1  2 NaN

Я хотел бы заменить значения в c значениями из словарей one_dict и two_dict, с результатом следующим образом:

In [45]: a_df
Out[45]:
    a  b   c
0   3  0 three
1   1  0 one
2   0  0 zero
3   2  0 .
4   3  0 .
5   1  0 .
6   2  1 calc
7   2  1 calc
8   3  1 blur
9   0  2 NaN
10  3  2 NaN
11  3  2 NaN
12  0  2 NaN
13  3  2 NaN
14  1  2 NaN

Попытка

Я не уверен, каким будет хороший подход к этому, хотя.

Я думал что я мог бы сделать что-то вроде следующего:

merge_df = pd.DataFrame(dict(one = one_dict, two=two_dict)).reset_index()
merge_df['zeros'] = 0
merge_df['ones'] = 1

давая

In [62]: merge_df
Out[62]:
   index    one    two  zeros  ones
0      0   zero  light      0     1
1      1    one   calc      0     1
2      2    two   line      0     1
3      3  three   blur      0     1
4      4   four  color      0     1

Затем объедините это в a_df, но я не уверен, как объединить и обновить в то же время, или если это хороший подход.

Правка

  • ключи соответствуют значениям столбца a
  • . просто сокращенно, это должно быть заполнено значением, поскольку другие

1 Ответ

3 голосов
/ 25 апреля 2020

Это просто вопрос создания нового кадра данных с правильной структурой и объединением:

(a_df.drop('c', axis=1)
    .merge(pd.DataFrame([one_dict,two_dict])
               .rename_axis(index='b',columns='a')
               .stack().reset_index(name='c'),
           on=['a','b'],
           how='left')
)

Вывод:

    a  b      c
0   3  0  three
1   1  0    one
2   0  0   zero
3   2  0    two
4   3  0  three
5   1  0    one
6   2  1   line
7   2  1   line
8   3  1   blur
9   0  2    NaN
10  3  2    NaN
11  3  2    NaN
12  0  2    NaN
13  3  2    NaN
14  1  2    NaN
...