我有一个数据集,它有一个列,看起来像这样
Badge Number
1
3
23 / gold
22 / silver
483
我只需要数字。下面是我的代码:
df = pd.read_excel('badges.xlsx')
df['Badge Number'] = df['Badge Number'].str.extract('(d+)')
print(df)
我期望输出如下:
Badge Number
1
3
23
22
483
但是我得到了
Badge Number
Nan
Nan
23
22
Nan
为了进行测试,我将数据帧转储为.csv文件,并使用pd.read_csv()将其读取回来。这给了我需要的数字(当然这不是一个解决方案)
我也试过
df['Badge Number'] = np.where(df['Badge Number'].str.isnumeric(), df['Badge Number'], df['Badge Number'].str.extract('(d+)'))
但这只给了我所有的15。我知道我在尝试一些我根本不理解的事情,但我希望有一个直接的解决方案。
这几乎可以肯定,因为这些数字实际上是整数,而不是字符串。尝试用原始数字填充缺失的值。
df['Badge Number'] = df['Badge Number'].str.extract('(d+)')[0].fillna(df['Badge Number'])#.astype(int)
另一个选择是在读取XLS时,将列指定为string。
使用dtype={'Badge Number': str}
df = pd.read_excel('badges.xlsx',dtype={'Badge Number': str})
df['Badge Number'] = df['Badge Number'].str.extract('(\d+)')
将expand
添加到False
df['Badge Number'] = df['Badge Number'].astype(str).str.extract('(d+)',expand=False)
df
Out[412]:
Badge Number
0 1
1 3
2 23
3 22
4 483