在熊猫中将数据类型从对象更改为字符串

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

在 DB2 中将数据类型从 DateTime 更改为 Time 会出错

如何在Mongodb中将字符串数据类型大量更改为int?

在 Pyspark 中将列类型从字符串更改为日期

在 Grails 中将主键 id 更改为字符串类型