【问题标题】:Change decimal separator (Python, Sqlite, Pandas)更改小数点分隔符(Python、Sqlite、Pandas)
【发布时间】:2022-01-30 15:01:15
【问题描述】:

我有一个 Excel 电子表格(从 SAP 中提取),其中包含数据(文本、数字)。我将这些数据转换为 DataFrame,进行一些计算,最后将其保存到 sqlite 数据库中。 而 excel 电子表格有一个逗号作为小数分隔符。 sqlite 数据库包含带有点作为小数分隔符的数字。

从代码中提取:

df_mce3 = pd.read_excel('rawdata/filename.xlsx', header=0, converters={'supplier': str, 'month': str}, decimal=',')

(decimal=',' 是建议的解决方案,仅在您使用 csv 时有效)

完成计算后,我使用以下代码将结果保存到 sqlite 数据库:

conn = sqlite.connect("database.db")
df_mce3.to_sql("rawdata", conn, if_exists="replace")
df_ka_ext.to_sql("costanalysis_external", conn, if_exists="replace")
[...]

输入:

month   ordqty  ordprice    ordervolume invoiceqty  invoiceprice    
08.2017 10,000  14,90       149,00      10,000      14,90

输出:

month   ordqty  ordprice    ordervolume invoiceqty  invoiceprice    
08.2017 10.000  14.90       149.00      10.000      14.90

我确实需要这些数字与输入数据具有相同的小数分隔符,但我找不到这样做的方法。

因此我想问你们中是否有人知道如何实现它?

我在 Mac OS X 上使用带有 pandas (0.19.1) 和 numpy (1.11.2) 的 Python 3.5。

谢谢!

【问题讨论】:

  • 如果你尝试了:f_mce3[cols[1:]] = df_mc3[cols[1:]].replace('.', ',') ?
  • 刚试了一下,运气不好。这些包含数字的列的数据类型是“float64”,没有.replace()。至少当我尝试在包含浮点数的单个变量上使用您的方法时,我被告知是这样的(number = 1234.45 | number.replace('.', ',') 导致错误)。
  • 没问题,这应该会有所帮助:f_mce3[cols[1:]] = df_mc3[cols[1:]].astype(str).replace('.', ',')
  • 它只是部分起作用。小数点分隔符未更改,但带有“NaN”的行已转换为“nan”。

标签: python excel sqlite pandas


【解决方案1】:

在 cmets 之后,我终于想出了一个至少适用于示例数据的解决方案。我将不得不检查它是否适用于我的实际数据。

#!/usr/bin/env python3.5
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))

def formatnumbers(x):
    x = round(x, 4)
    x = str(x).replace('.', ',')
    return x

for col in df.columns:
    df[col] =  df[col].apply(formatnumbers)

print(df.head(n=5))

结果是:

         A        B        C        D
0  -0,4065  -1,6113   0,2257   0,7424
1   0,8349   0,0316   -1,105  -1,6463
2  -0,2108   0,7356  -1,0823   0,5261
3   0,3382   0,6158   0,6117  -0,3896
4   -0,403  -1,3639   0,8691   0,5791

【讨论】:

    【解决方案2】:

    您需要在保存之前转换 float 值。只需遍历包含. 的值的列,将每个值转换为字符串,然后您就可以使用replace 方法。

    这里我转换了x列中的所有值

    df['x'] = [str(val).replace('.', ',') for val in df['x']]
    df.to_sql('rawdata', conn, if_exists='replace')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-30
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多