熊猫数据框金额值与美元符号

时间:2020-05-05 09:49:21

标签: python pandas numeric

我在下面的列中有一个熊猫数据框。 Column_1是字符串/文本,不是整数或十进制。几行具有字符串值以及名称(请参阅第6行)

S.No.  Column_1
1      256
2      1
3      $300.54672
4      756
5      $292.34333
6      Andrew

我想将column_1中的所有值转换为数字/整数,但美元值和带有“名称”的行除外。我要求保留美元符号,但金额应四舍五入至小数点后两位。

预期输出:

S.No.  Column_1
1           256
2             1
3       $300.55
4           756
5       $292.34
6       Andrew

我使用pd.to_numeric()将整个列转换为数值,并且错误='coerce',但由于错误,数量值变为空白(或)为null。

任何对此的建议/帮助将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:3)

$开头的Series.str.startswith过滤值,以Series.str.strip开头的$过滤,转换为数字,四舍五入,转换为字符串,并在$前面加上: / p>

m = df['Column_1'].str.startswith('$', na=False)

s = '$' + df.loc[m, 'Column_1'].str.strip('$').astype(float).round(2).astype(str)

或者:

s = df.loc[m, 'Column_1'].str.strip('$').astype(float).round(2).astype(str).radd('$')

df.loc[m, 'Column_1'] = s


print (df)
   S.No. Column_1
0      1      256
1      2        1
2      3  $300.55
3      4      756
4      5  $292.34

如果需要将不匹配的值最后一次转换为数字,但会得到混合的数据类型-带有$的字符串和没有$的数字:

df.loc[~m, 'Column_1'] = pd.to_numeric(df.loc[~m, 'Column_1'])
print (df)
   S.No.    Column_1
0      1         256
1      2           1
2      3  $300.54672
3      4         756
4      5  $292.34333

print (df['Column_1'].apply(type))
0    <class 'int'>
1    <class 'int'>
2    <class 'str'>
3    <class 'int'>
4    <class 'str'>
Name: Column_1, dtype: object

最后一段的编辑:可以添加errors='coerce',将非数字转换为缺失值,然后将其替换为原始值:

df.loc[~m, 'Column_1'] = pd.to_numeric(df.loc[~m, 'Column_1'], errors='coerce').fillna(df['Column_1'])
print (df)
   S.No. Column_1
0      1      256
1      2        1
2      3  $300.55
3      4      756
4      5  $292.34
5      6   Andrew

print (df['Column_1'].apply(type))

0    <class 'float'>
1    <class 'float'>
2      <class 'str'>
3    <class 'float'>
4      <class 'str'>
5      <class 'str'>
Name: Column_1, dtype: object