我有一个熊猫数据框,其中有一列叫做“图片”;该列的值以数字或字母开头。我想做的是创建一个新列,检查该值是否以字母或数字开头,并相应地填充该新列。我正在使用np.where,代码在下面(raw_master是数据框,“ database”是新列):
def iaps_or_naps(x):
if x in ["1","2","3","4","5","6","7","8","9"]:
return True
else:
return False
raw_master['database'] = np.where(iaps_or_naps(raw_master.picture[?][0])==True, 'IAPS', 'NAPS')
我的问题是,如果我只做raw_master.picture[0]
,它将检查整个字符串的值,这不是我所需要的。我需要第一个角色;但是,如果我执行raw_master.picture[0][0]
,那将只求整个数据帧第一行的第一个字符。顺便说一句,问号只是意味着我不确定在那放什么。
如何获取它,以便每一行都使用字符串的第一个字符?
非常感谢!
答案 0 :(得分:4)
您不需要为此编写自己的函数。以这个小df为例:
s = pd.DataFrame(['3asd', 'asd', '3423', 'a123'])
看起来像:
0
0 3asd
1 asd
2 3423
3 a123
使用内置的熊猫:
# checking first column, s[0], first letter, str[0], to see if it is digit.
# if so, assigning IAPS, if not, assigning NAPS
s['database'] = np.where(s[0].str[0].str.isdigit(), 'IAPS', 'NAPS')
输出:
0 database
0 3asd IAPS
1 asd NAPS
2 3423 IAPS
3 a123 NAPS
将此应用于您的数据框:
raw_master['database'] = np.where(raw_master['picture'].str[0].str.isdigit(), 'IAPS', 'NAPS')
答案 1 :(得分:1)
IIUC,您可以使用pd.to_numeric
np.where(pd.to_numeric(df['your_col'].str[0],errors='coerce').isnull(),'IAPS'
,'NAPS') # ^ not a number
#^ number
答案 2 :(得分:0)
您可以使用诸如apply
之类的映射函数,该函数对列中的每个元素进行迭代,以这种方式通过索引[0]
访问第一个字符
df['new_col'] = df['picture'].apply(lambda x: 'IAPS' if x[0].str.isdigit() else 'NAPS')