如何将这些包含字符串的列转换为float,同时保持其含义?

2024-04-28 10:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想列Actual、Forecast、Previous转换为float,以便对它们进行计算。csv还包含一些应该保留的nan

csv文件如下所示:

2018-01-04 04:30:00,GBP,Low Impact Expected,Mortgage Approvals,65K,64K,65K
2018-01-04 04:51:00,EUR,Low Impact Expected,Spanish 10-y Bond Auction,1.53|1.8,,1.49|2.0
2018-01-04 05:01:00,EUR,Low Impact Expected,French 10-y Bond Auction,0.79|1.4,,0.36|1.9
2018-01-04 07:30:00,USD,Low Impact Expected,Challenger Job Cuts y/y,-3.6%,,30.1%

到目前为止,我已经尝试过:

df.columns = ['Date','Currency','Impact','Event','Actual','Forecast','Previous']

df = df[~(df['Actual'].isin('|','<']))]
#df = df[~df.Actual.str.contains("|")]

df['Actual'] = df['Actual'].str.replace('%', '')
df['Forecast'] = df['Forecast'].str.replace('%', '')
df['Previous'] = df['Previous'].str.replace('%', '')

df['Actual'] = df['Actual'].str.replace('K', '000')
df['Forecast'] = df['Forecast'].str.replace('K', '000')
df['Previous'] = df['Previous'].str.replace('K', '000')

for i in df['Actual']: float(i)
for i in df['Forecast']: float(i)
for i in df['Previous']: float(i)

去除和<;不要工作。互联网上的许多建议似乎与文件中的值有关

我也不知道如何替换%,同时移动小数点,这样数字表示就正确了

希望有人能帮忙。谢谢


Tags: 文件csvindfforfloateurreplace
2条回答

这不是最漂亮的方法,但我相信这就是你想要的:

from io import StringIO
import pandas as pd
df = pd.read_table(StringIO("""2018-01-04 04:30:00,GBP,Low Impact Expected,Mortgage Approvals,65K,64K,65K
2018-01-04 04:51:00,EUR,Low Impact Expected,Spanish 10-y Bond Auction,1.53|1.8,,1.49|2.0
2018-01-04 05:01:00,EUR,Low Impact Expected,French 10-y Bond Auction,0.79|1.4,,0.36|1.9
2018-01-04 07:30:00,USD,Low Impact Expected,Challenger Job Cuts y/y,-3.6%,,30.1%"""), names=['Date','Currency','Impact','Event','Actual','Forecast','Previous'], sep=',')
df = df.loc[~df['Actual'].str.contains('[\|\<]')]
for col in ['Actual', 'Forecast', 'Previous']:
    df.loc[pd.notnull(df[col]) & df[col].str.contains('\%'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.contains('\%'), col].str.replace('%', '')) / 100
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('K'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('K'), col].str.replace('K', '')) * 1000

这是我目前的解决方案,如果有人感兴趣,感谢宇宙探索的帮助

import pandas as pd

#  Importing economic calendar
df = pd.read_csv('EconomicCalendar.csv')
df.columns = ['Date','Currency','Impact','Event','Actual','Forecast','Previous']


#  Remove no and low impact rows, remove votes beacuse of #format not convertable
df = df[df.Impact != 'Non-Economic']

event_filter = ['Asset Purchase Facility Votes', 'Official Bank Rate Votes']
df = df.loc[~df['Event'].str.contains('|'.join(event_filter))]

for col in ['Actual', 'Forecast', 'Previous']:
    #  Remove rows with certain formats not convertable
    df = df.loc[~df[col].str.contains('|'.join(['\|','\<']), na=False)]

    #  Change %, K, M, B, T into numerics
    df.loc[pd.notnull(df[col]) & df[col].str.contains('\%'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.contains('\%'), col].str.replace('%', '')) / 100
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('K'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('K'), col].str.replace('K', '')) * 1000
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('M'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('M'), col].str.replace('M', '')) * 1000000
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('B'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('B'), col].str.replace('B', '')) * 1000000000
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('T'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('T'), col].str.replace('T', '')) * 1000000000000

    #  Change all to numeric to perform calculation
    df[col] = pd.to_numeric(df[col])


#  Creating Surprise column which is Actual minus Forecast
df['Surprise'] = df['Actual']-df['Forecast']

相关问题 更多 >