在熊猫中将数据类型从对象更改为字符串
Posted
技术标签:
【中文标题】在熊猫中将数据类型从对象更改为字符串【英文标题】:Change data type from object to string in pandas 【发布时间】:2022-01-09 18:04:23 【问题描述】:这看起来很简单,但我就是想不通。
我有一个数据框,其中包含 GBpence、Euro 和 USD 的金额列。我需要一个以英镑为单位的新列,我能想到的唯一方法是首先将金额字段转换为字符串,将金额与货币符号分开,然后使用 numpy 执行条件计算。
df = pd.DataFrame('date': ['2018-11-22','2018-11-23','2018-11-24'],
'amount': ['3.80p','$4.50','\Neuro sign3.40'],
'usd-gbp':['0.82','0.83','0.84'],
'eur-gbp':['0.91','0.92','0.93'])
我正在尝试将金额列转换为字符串,以便提取货币和浮动金额,但它只是将所有行转换为相同的字符串。
df['new'] = str(df['amount'])
预期的输出只是字符串格式的数量值,因此我可以对它们执行切片。
任何帮助将不胜感激。谢谢。
【问题讨论】:
请在您的问题中包含预期的输出。 【参考方案1】:您可以使用replace
将货币符号替换为“0.82*”和“0.91*”,然后使用pd.eval
评估操作:
to_gbp = 'p': '*1', '\$': '0.82*', '€': '0.91*'
df['gbp'] = pd.eval(df['amount'].replace(to_gbp, regex=True))
print(df)
# Output:
amount usd-gbp eur-gbp gbp
0 3.80p 0.82 0.91 3.800
1 $4.50 0.82 0.91 3.690
2 €3.40 0.82 0.91 3.094
关于replace
的详细信息:
>>> df['amount'].replace(to_gbp, regex=True)
0 3.80*1
1 0.82*4.50
2 0.91*3.40
Name: amount, dtype: object
更新
我没有提到汇率会因日期而异。我已经更新了这个问题,所以展示一下。 'replace' 仍然可以做到这一点吗?
创建一个自定义函数并将其应用于每一行:
def convert(row):
d = '$': 'usd-gbp', '€': 'eur-gbp'
c = row['amount'][0]
return float(row['amount'][1:]) * float(row[d[c]]) \
if c in d else float(row['amount'][:-1])
df['gbp'] = df.apply(convert, axis=1)
print(df)
# Output:
date amount usd-gbp eur-gbp gbp
0 2018-11-22 3.80p 0.82 0.91 3.800
1 2018-11-23 $4.50 0.83 0.92 3.735
2 2018-11-24 €3.40 0.84 0.93 3.162
【讨论】:
对不起,我试图简化帖子的问题。我没有提到汇率会根据日期而有所不同。我已经更新了这个问题,所以展示一下。 'replace' 仍然可能吗? 太棒了,效果很好。谢谢。 很高兴看到 :)以上是关于在熊猫中将数据类型从对象更改为字符串的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Asp.Net Core Identity 中将 PasswordHash 的数据类型从字符串更改为字节数组
如何在laravel迁移中将数据类型float更改为string