带有前缀的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熊猫数据框字符串转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章