pandas 标识混合整数和字符串列中的特定整数

ajsxfq5m  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(117)

我在pandas df中有一个名为specialty的列,看起来像这样:

0         1,5
1           1
2     1,2,4,6    
3           2
4           1
5         1,5
6           3
7           3
8           1
9         2,3

我想创建一个名为is_1的新列,specialty中包含1的所有行都包含1,不包含1的行都包含0。输出如下所示:

0       1
1       1
2       1
3       0
4       1
5       1
6       0
7       0
8       1
9       0

我不知道如何使用混合dtypes的列来实现这一点。我是否可以只使用np.where()str.contains()调用?像这样:

np.where((part_chars['specialty'] == 1) | part_chars['specialty'].str.contains('1'), 1, 0)

是的,这工作……

monwx1rj

monwx1rj1#

使用str.contains和一个匹配完整字的正则表达式,该正则表达式等于1

part_chars['is_1'] = (part_chars['specialty'].astype(str)
                      .str.contains(r'\b1\b').astype(int)
                     )

输出:

specialty  is_1
0       1,5     1
1         1     1
2   1,2,4,6     1
3         2     0
4         1     1
5       1,5     1
6         3     0
7         3     0
8         1     1
9       2,3     0
您的解决方案:
part_chars = pd.DataFrame({'specialty': ['1,5', '1', '1,2,4,6', '2', '1', '1,5', '3', '3', '1', '2,3', '21']})
part_chars['is_1'] = np.where((part_chars['specialty'] == 1) | part_chars['specialty'].str.contains('1'), 1, 0)

输出:

specialty  is_1
0        1,5     1
1          1     1
2    1,2,4,6     1
3          2     0
4          1     1
5        1,5     1
6          3     0
7          3     0
8          1     1
9        2,3     0
10        21     1  # might be unwanted
oxosxuxt

oxosxuxt2#

更新你的代码对我来说很好。

>>> np.where((part_chars['specialty'] == 1) | part_chars['specialty'].str.contains('1'), 1, 0)
array([1, 1, 1, 0, 1, 1, 0, 0, 1, 0])

如果你有混合的dtype,你可以用.astype(str)强制dtype:

>>> np.where(part_chars['specialty'].astype(str).str.contains('1'), 1, 0)
array([1, 1, 1, 0, 1, 1, 0, 0, 1, 0])

您可以使用str.contains

part_chars['is_1'] = (part_chars['specialty'].astype(str)
                          .str.contains(r'\b1\b').astype(int))
print(part_chars)

# Output
  specialty  is_1
0       1,5     1
1         1     1
2   1,2,4,6     1
3         2     0
4         1     1
5       1,5     1
6         3     0
7         3     0
8         1     1
9       2,3     0

str.split的替代方案:

part_chars['is_1'] = (part_chars['specialty'].str.split(',', expand=True)
                          .eq('1').any(axis=1).astype(int))
print(part_chars)

# Output
  specialty  is_1
0       1,5     1
1         1     1
2   1,2,4,6     1
3         2     0
4         1     1
5       1,5     1
6         3     0
7         3     0
8         1     1
9       2,3     0

相关问题