带有前缀的Python熊猫数据框字符串转换为浮点数

Posted

技术标签:

【中文标题】带有前缀的Python熊猫数据框字符串转换为浮点数【英文标题】:Python panda dataframe string with prefix convert to float 【发布时间】:2020-07-02 06:31:57 【问题描述】:

我有一个字符串数据框,我使用 df.astype('float', errors = 'ignore') 将其转换为浮点数。

我使用了iloc,然后有一个循环遍历所有列。

问题是某些列中的某些值有前缀,在给定列中,数字可能是['0.02u\n', '0.1\n', '2.02n\n' .... ]

重点是u = 10^(-6)n = 10^(-9)。问题是如何以优雅的方式将其转换为浮点数。

【问题讨论】:

你为什么有\n?如果是除法,您的意思不应该是/n。通常\n 代表换行符。 是的,它是来自先前程序的换行注释。我的解决方案是简单地使用循环:Se my answer below 【参考方案1】:

我使用的解决方案是查看所有单元格,看看字符串末尾是否有“n”或“u”。去掉字母,转换成浮点数再相乘。

no_col = len(df_T.columns)
no_row = len(df_T)
for i in range(0,no_col):
   for j in range(0,no_row):
        df_T.iloc[j,i] = df_T.iloc[j,i][:-1]
for i in range(0,no_col):
   for j in range(0,no_row):
     if df_T.iloc[j,i][-1] == 'u':
         df_T.iloc[j,i] = df_T.iloc[j,i][:-1]
         df_T.iloc[j,i] = float(df_T.iloc[j,i])
         df_T.iloc[j,i] = df_T.iloc[j,i]*10**-6
     elif df_T.iloc[j,i][-1] == 'n':
         df_T.iloc[j,i] = df_T.iloc[j,i][:-1]
         df_T.iloc[j,i] = float(df_T.iloc[j,i])
         df_T.iloc[j,i] = df_T.iloc[j,i]*10**-9
     else:
         df_T.iloc[j,i] = float(df_T.iloc[j,i])
         

【讨论】:

【参考方案2】:

Pandas 可以使用pd.eval() 计算列中的表达式。所以,如果你有一个字符串格式的表达式,你可以申请pd.eval(),它会被评估。

要使用它,首先您可以删除列中的 \n,我使用了.replace()。 接下来,要使pd.eval() 可以读取表达式 - 例如,应将“3x”转换为“3*x”,再次使用.replace 和正则表达式。 最后申请pd.eval(),它就会被评估。

import pandas as pd

df = pd.DataFrame('col': ['0.02u\n', '0.1\n', '2.02n\n'])
u = 10^(-6)
n = 10^(-9)

# Remove the \n characters
df['col'] = df['col'].replace(to_replace="\n", value="", regex=True)
# Put '*' for multiplication --> '3x' will be converted to '3*x'
df['col'] = df['col'].replace(to_replace=r"((?:\d+)|(?:[a-zA-Z]\w*\(\w+\)))((?:[a-zA-Z]\w*)|\()",
                              value=r"\1*\2", regex=True)
df['val'] = pd.eval(df['col'])
print(df)

结果:

      col   val
0  0.02*u -0.32
1     0.1  0.10
2  2.02*n -6.06

【讨论】:

以上是关于带有前缀的Python熊猫数据框字符串转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:无法在熊猫中将字符串转换为浮点数

如何将表示为字符串的数字转换为浮点数

Pyspark 数据框将多列转换为浮点数

遍历 pandas 数据框中的列和行并将字符串转换为浮点数

数字后带有减号的 CSV 文件。 “ValueError:无法将字符串转换为浮点数:”

Python:ValueError:无法将字符串转换为浮点数:'0'