用两本字典绘制一只熊猫专栏图

共6个回答, 标签: python pandas

我有一个 df :

ColA  ColB
1     1
2     3
2     2
1     2
1     3
2     1

我想使用两个不同的字典来更改 ColB 中的值。d1如果 ColA 中的值为 1, 如果 d2 colb 中的值为 2, 我想使用。

d1 = {1:'a',2:'b',3:'c'}
d2 = {1:'d',2:'e',3:'f'}

导致:

ColA  ColB
1     a
2     f
2     e
1     b
1     c
2     d

如何做到这一点的最佳途径?

第1个答案

一种方法是 np.where map ColB 使用一个字典或另一种字典中的值, 具体取决于 ColA 以下各项的值:

import numpy as np
df['ColB'] = np.where(df.ColA.eq(1), df.ColB.map(d1), df.ColB.map(d2))

这给了:

    ColA ColB
0     1    a
1     2    f
2     2    e
3     1    b
4     1    c
5     2    d

对于更通用的解决方案, 您可以 np.select 使用, 它适用于多个条件。让我们在字典中添加另一个值 ColA 和一个值, 看看如何使用三个不同的映射来执行此操作:

print(df)
    ColA ColB
0     1     1
1     2     3
2     2     2
3     1     2
4     3     3
5     3     1

values_to_map = [1,2,3]
d1 = {1:'a',2:'b',3:'c'}
d2 = {1:'d',2:'e',3:'f'}
d3 = {1:'g',2:'h',3:'i'}

#create a list of boolean Series as conditions
conds = [df.ColA.eq(i) for i in values_to_map]
# List of Series to choose from depending on conds
choices = [df.ColB.map(d) for d in [d1,d2,d3]]
# use np.select to select form the choice list based on conds
df['ColB'] = np.select(conds, choices)

导致:

    ColA ColB
0     1    a
1     2    f
2     2    e
3     1    b
4     3    i
5     3    g
第2个答案

您可以使用新词典, 其中的键是 tuple s, 并将其映射到压缩列。

d = {**{(1, k): v for k, v in d1.items()}, **{(2, k): v for k, v in d2.items()}}
df.assign(ColB=[*map(d.get, zip(df.ColA, df.ColB))])

   ColA ColB
0     1    a
1     2    f
2     2    e
3     1    b
4     1    c
5     2    d

或者我们可以得到可爱与 lambda 地图。
: 我对字典进行了对齐, 以便根据它们在列表中的相对位置在它们之间切换 [0, d1, d2] 。 在这种情况下, 第一个位置是什么并不重要。 我 0 随便说。

df.assign(ColB=[*map(lambda x, y: [0, d1, d2][x][y], df.ColA, df.ColB)])

   ColA ColB
0     1    a
1     2    f
2     2    e
3     1    b
4     1    c
5     2    d

为了鲁棒性, 我会远离可爱, 并映射一个具有一些默认值功能的 lambda

df.assign(ColB=[*map(lambda x, y: {1: d1, 2: d2}.get(x, {}).get(y), df.ColA, df.ColB)])

   ColA ColB
0     1    a
1     2    f
2     2    e
3     1    b
4     1    c
5     2    d
第3个答案

如果需要对许多组执行 dict 此操作, 请使用 a s dict 分别映射每个组。理想情况下, 您可以找到一些功能的方法来创建 d :

d = {1: d1, 2: d2}
df['ColB'] = pd.concat([gp.ColB.map(d[idx]) for idx, gp in df.groupby('ColA')])

输出:

   ColA ColB
0     1    a
1     2    f
2     2    e
3     1    b
4     1    c
5     2    d
第4个答案

我使用 concatreindex

idx=pd.MultiIndex.from_arrays([df.ColA, df.ColB])
df.ColB=pd.concat([pd.Series(x) for x in [d1,d2]],keys=[1,2]).reindex(idx).values
df
Out[683]:
   ColA ColB
0     1    a
1     2    f
2     2    e
3     1    b
4     1    c
5     2    d
第5个答案

您可以创建一个函数, 对一个元素执行此操作, 然后对数据框架使用应用 lambda

def your_func(row):
    if row["ColA"] == 1:
        return d1[row["ColB"]]
    elif row["ColB"] == 2:
        return d2[row["ColB"]]
    else:
        return None

df["ColB"] = df.apply(lambda row: your_func(row), axis=1)
第6个答案

您可以使用两个替换如下:

df.loc[df['ColA'] == 1,'ColB'] = df['ColB'].replace(d1, regex=True)
df.loc[df['ColA'] == 2,'ColB'] = df['ColB'].replace(d2, regex=True)

我希望能有所帮助 Br

相关问题

通过随机抽样其他列数据创建新列 如何使用熊猫获得包括每一个组合的计数 如何有效地展开矩阵的值与小块? 如何破坏 Python 对象并释放内存 将具有特殊格式的文本文档转换为熊猫数据框架 用两本字典绘制一只熊猫专栏图