python 获取和处理 csv 中某些字符之间的值
python get and process value between certain characters in csv
其实和pandas有关,我在一个csv文件里有几条记录(大约40000条),其中一列的值是market_value
,例如:
原始记录
player_id,player_name,club,age,market_value,date
3713,massimo-maccarone,UC Sampdoria,31,£2.55m,2011-01-10
3713,massimo-maccarone,UC Sampdoria,31,£1.70m,2011-06-21
3713,massimo-maccarone,FC Empoli,32,£850k,2012-01-01
3713,massimo-maccarone,FC Empoli,32,£680k,2012-06-15
...
在这里我想提取 market_value
的值并将其转换成某种格式,如
player_id,player_name,club,age,market_value,date
3713,massimo-maccarone,UC Sampdoria,31,2550000,2011-01-10
3713,massimo-maccarone,UC Sampdoria,31,1700000,2011-06-21
3713,massimo-maccarone,FC Empoli,32,850000,2012-01-01
3713,massimo-maccarone,FC Empoli,32,680000,2012-06-15
...
这意味着我想将其转换为数字形式,然后导入到 database.And 我已经编写了一个正则表达式方法来实现它,例如:
import re
def regex_format(test_str):
if re.search('^£.+k$',test_str):
return float(re.search('^£(.+)k$',test_str).group(1))*1000
elif re.search('^£(.+)m$',test_str):
return float(re.search('^£(.+)m$',test_str).group(1))*1000000
else:
return 0.0
它适用于那些字符串,但是当我尝试通过 pandas 在 csv 文件中应用它时,我遇到了问题,我的代码如下:
import pandas as pd
import currency_format
df=pd.read_csv('the_market_value_o.csv')
df['market_value']=currency_format.regex_format(df['market_value'])
print df
我遇到了这样的异常:
TypeError:expected string or buffer
然后我尝试通过以下方法将系列转换为字符串:
df['market_value'].astype(basestring)
但是没用。
顺便说一句,我的 python 版本是 Python 2.7.12 :: Anaconda 4.0.0 (64-bit)
和 pandas 0.18.0
感谢任何帮助,谢谢。
我认为问题在于 df[market_value]
是一个系列(字符串)而不是单个字符串。将其视为数据的 slice/column -- 就像值列表一样。因此,请尝试以下操作:
df['market_value'].map(currency_format.regex_format)
这个答案 here 有更多这样的 functions/examples。
其实和pandas有关,我在一个csv文件里有几条记录(大约40000条),其中一列的值是market_value
,例如:
原始记录
player_id,player_name,club,age,market_value,date
3713,massimo-maccarone,UC Sampdoria,31,£2.55m,2011-01-10
3713,massimo-maccarone,UC Sampdoria,31,£1.70m,2011-06-21
3713,massimo-maccarone,FC Empoli,32,£850k,2012-01-01
3713,massimo-maccarone,FC Empoli,32,£680k,2012-06-15
...
在这里我想提取 market_value
的值并将其转换成某种格式,如
player_id,player_name,club,age,market_value,date
3713,massimo-maccarone,UC Sampdoria,31,2550000,2011-01-10
3713,massimo-maccarone,UC Sampdoria,31,1700000,2011-06-21
3713,massimo-maccarone,FC Empoli,32,850000,2012-01-01
3713,massimo-maccarone,FC Empoli,32,680000,2012-06-15
...
这意味着我想将其转换为数字形式,然后导入到 database.And 我已经编写了一个正则表达式方法来实现它,例如:
import re
def regex_format(test_str):
if re.search('^£.+k$',test_str):
return float(re.search('^£(.+)k$',test_str).group(1))*1000
elif re.search('^£(.+)m$',test_str):
return float(re.search('^£(.+)m$',test_str).group(1))*1000000
else:
return 0.0
它适用于那些字符串,但是当我尝试通过 pandas 在 csv 文件中应用它时,我遇到了问题,我的代码如下:
import pandas as pd
import currency_format
df=pd.read_csv('the_market_value_o.csv')
df['market_value']=currency_format.regex_format(df['market_value'])
print df
我遇到了这样的异常:
TypeError:expected string or buffer
然后我尝试通过以下方法将系列转换为字符串:
df['market_value'].astype(basestring)
但是没用。
顺便说一句,我的 python 版本是 Python 2.7.12 :: Anaconda 4.0.0 (64-bit)
和 pandas 0.18.0
感谢任何帮助,谢谢。
我认为问题在于 df[market_value]
是一个系列(字符串)而不是单个字符串。将其视为数据的 slice/column -- 就像值列表一样。因此,请尝试以下操作:
df['market_value'].map(currency_format.regex_format)
这个答案 here 有更多这样的 functions/examples。