Pandas合并Series为DataFrame时遇TypeError(float与str运算)求助
问题解决:TypeError: unsupported operand type(s) for -: 'float' and 'str'
错误原因
当你使用np.array(aud_usd_lst)将包含字符串(日期)和浮点数的元组列表转换为numpy数组时,numpy会将所有元素统一为字符串类型。这导致你的aud_usd_series和eur_aud_series中的汇率值实际是字符串,而非浮点数。后续pandas在处理这些Series时,若涉及数值运算(比如合并时的内部对齐逻辑),就会触发字符串与浮点数无法运算的类型错误。
修复后的代码
方法1:直接拆分列表构造Series(推荐)
不需要借助numpy,直接从列表中提取索引和数值:
import pandas as pd import numpy as np aud_usd_lst = [ ('2020-09-08', 0.7280), ('2020-09-09', 0.7209), ('2020-09-11', 0.7263), ('2020-09-14', 0.7281), ('2020-09-15', 0.7285), ] eur_aud_lst = [ ('2020-09-08', 1.6232), ('2020-09-09', 1.6321), ('2020-09-10', 1.6221), ('2020-09-11', 1.6282), ('2020-09-15', 1.6288), ] # 拆分日期和数值,直接构造Series aud_usd_series = pd.Series([x[1] for x in aud_usd_lst], index=[x[0] for x in aud_usd_lst]) eur_aud_series = pd.Series([x[1] for x in eur_aud_lst], index=[x[0] for x in eur_aud_lst]) # 合并为DataFrame df = pd.DataFrame({'AUD/USD': aud_usd_series, 'EUR/AUD': eur_aud_series}) print(df)
方法2:转换numpy数组的数值类型为float
如果你坚持用numpy,可以手动将数值列转换为浮点数:
import pandas as pd import numpy as np aud_usd_lst = [ ('2020-09-08', 0.7280), ('2020-09-09', 0.7209), ('2020-09-11', 0.7263), ('2020-09-14', 0.7281), ('2020-09-15', 0.7285), ] eur_aud_lst = [ ('2020-09-08', 1.6232), ('2020-09-09', 1.6321), ('2020-09-10', 1.6221), ('2020-09-11', 1.6282), ('2020-09-15', 1.6288), ] # 转换数值为float类型 aud_usd_arr = np.array(aud_usd_lst) aud_usd_series = pd.Series(aud_usd_arr[:,1].astype(float), index=aud_usd_arr[:,0]) eur_aud_arr = np.array(eur_aud_lst) eur_aud_series = pd.Series(eur_aud_arr[:,1].astype(float), index=eur_aud_arr[:,0]) # 合并为DataFrame df = pd.DataFrame([aud_usd_series, eur_aud_series]).T df.columns = ['AUD/USD','EUR/AUD'] print(df)
说明
两种方法都能确保Series中的汇率值是浮点数类型,避免类型错误。方法1更简洁高效,无需额外的类型转换步骤,是推荐的做法。
内容的提问来源于stack exchange,提问作者ste
相关产品推荐
相关产品推荐

