numpy 根据每行满足的条件向数据框添加一列(Pandas)

omqzjyyz  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(154)

假设我有一个数据框,其中包含以下元素:
Element
0 a_1
1 a_2
2 b_1
3 a_3
4 b_2
.....
诸若此类。
现在假设我有两个类别AB。每个元素都属于这些类别之一,假设我有列表As = [a_1, a_2, ...]Bs = [b_1, b_2, ...]
我想要做的是将列Category添加到df:
Element Category
0 a_1 A
1 a_2 A
2 b_1 B
3 a_3 A
4 b_2 B
.....
也就是说,我们将查询df的每一行,检查元素是否在这些列表中,并且新列的值将是它所在的列表。每个元素都将位于这些列表中的一个列表中。
我该如何着手做这件事呢?
我曾考虑通过检查每一行来为新列创建一个新的数组Via for循环,但我觉得应该有一种更时髦、更典型的方法来实现这一点。

yx2lnoni

yx2lnoni1#

不使用列表,而是使用字典,并将其反转为与map一起使用:

d = {'A': ['a_1', 'a_2', 'a_3'],
     'B': ['b_1', 'b_2'],
    }

d2 = {k: v for v, l in d.items() for k in l}

df['Category'] = df['Element'].map(d2)

输出:

Element Category
0     a_1        A
1     a_2        A
2     b_1        B
3     a_3        A
4     b_2        B
34gzjxbg

34gzjxbg2#

使用np.where和numpy.in1d

  • np.where--根据条件返回从x或y中选择的元素。
  • numpy.in1d--测试一维数组的每个元素是否也出现在第二个数组中。
    代码

# Add column Category by Assigning 'A' if the element in list A else assign 'B'

df['Category'] = np.where(np.in1d(df['Element'], A), 'A', 'B')

其中:

A = ['a_1', 'a_2', 'a_3']

# B not needed since "Every element falls into one of these categories" (i.e. in B if not in A)

相关问题