Python 使用掩码替换numpy数组中的字符串会导致字符串被截断

Python 使用掩码替换numpy数组中的字符串会导致字符串被截断,python,pandas,numpy,Python,Pandas,Numpy,在一个更大的项目中,我使用遮罩根据一系列其他输入设置绘图的颜色。在一组中,默认颜色为'darkgreen',除非遮罩为True,然后它变为'white'。在第二组中,情况正好相反。下面的代码是仅包括掩码/阵列设置的MRE 将'darkgreen'转换为'white'的部分工作正常。但当我试图将'white'转换为'darkgreen'时,它会将其截断为'darkg'。我假设它在字符串中使用相同数量的字符,但我不确定为什么或如何修复它!提前谢谢 import numpy as np import

在一个更大的项目中,我使用遮罩根据一系列其他输入设置绘图的颜色。在一组中,默认颜色为
'darkgreen'
,除非遮罩为
True
,然后它变为
'white'
。在第二组中,情况正好相反。下面的代码是仅包括掩码/阵列设置的MRE

'darkgreen'
转换为
'white'
的部分工作正常。但当我试图将
'white'
转换为
'darkgreen'
时,它会将其截断为
'darkg'
。我假设它在字符串中使用相同数量的字符,但我不确定为什么或如何修复它!提前谢谢

import numpy as np
import pandas as pd

df=pd.DataFrame(np.random.randn(30, 2), columns=['A','B'])

a_mask = df['A'] > 0
b_mask = df['B'] > 0

n = 30

uca = ['darkgreen' for i in range(n)]
uca = np.array(uca)
uc = uca.copy()
uc[a_mask] = 'white'
dca = ['white' for i in range(n)]
dca = np.array(dca)
dc = dca.copy()
dc[b_mask] = 'darkgreen'
print(uc)
print(dc)

您需要使用numpy的
where
功能:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randn(30, 2), columns=['A', 'B'])

a_mask = df['A'] > 0
b_mask = df['B'] > 0

n = 30

uca = ['darkgreen' for i in range(n)]
uca = np.array(uca)
uc = uca.copy()
uc[a_mask] = 'white'
dca = ['white' for i in range(n)]
dca = np.array(dca)
dc = dca.copy()
dc = np.where(b_mask, 'darkgreen', dc)
print(uc)
print(dc)

您需要使用numpy的
where
功能:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randn(30, 2), columns=['A', 'B'])

a_mask = df['A'] > 0
b_mask = df['B'] > 0

n = 30

uca = ['darkgreen' for i in range(n)]
uca = np.array(uca)
uc = uca.copy()
uc[a_mask] = 'white'
dca = ['white' for i in range(n)]
dca = np.array(dca)
dc = dca.copy()
dc = np.where(b_mask, 'darkgreen', dc)
print(uc)
print(dc)

检查字符串数组的数据类型:

>>> uca.dtype
dtype('<U9')

>>> dca.dtype
dtype('<U5')
>>uca.dtype

数据类型('检查字符串数组的数据类型:

>>> uca.dtype
dtype('<U9')

>>> dca.dtype
dtype('<U5')
>>uca.dtype

dtype('我以前从未遇到过这种Ndarays怪癖-通常用于数字本身。如果它解决了您的问题,请不要忘记接受答案;)我以前从未遇到过这种Ndarays怪癖-通常用于数字本身。如果它解决了您的问题,请不要忘记接受答案;)
numpy
带有字符串的数组具有固定的字符长度,例如
U10
。检查
dtype
。将较长的字符串写入数组会导致截断
pandas
对字符串使用对象数据类型,因此没有截断。顺便说一句,你可以用uca中的
['darkgreen']*n
替换
['darkgreen']]
,对dca也是如此。
numpy
带有字符串的数组具有固定的字符长度,例如
U10
。检查
dtype
。将较长的字符串写入数组会导致截断
pandas
对字符串使用对象数据类型,因此没有截断。顺便说一句,您可以将
['darkgreen'替换为uca中的i(n)]
和dca中的
['darkgreen']*n