有条件地将数据合并到现有的pandas数据框架列中。

问题描述 投票:0回答:1

我有以下数据。

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_dicttwo_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
  • . 只是速记,这个应该和别人一样填上数值。
python pandas merge data-manipulation
1个回答
3
投票

这只是创建正确结构的新数据框架并合并的问题。

(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
© www.soinside.com 2019 - 2024. All rights reserved.