pandas拆分某列中数字和单位
最近有csv文件需要处理,需要拆分里面的数字和单位做下数据的整理
以下是数据格式
想把单位拆分出来,单位有的是亿和万,需要对数据进行下处理
这是可以使用extract
做下正则处理,拆分出来数字和单位
extract(正则拆分字符串)
extract文档地址:https://pandas.pydata.org/docs/reference/api/pandas.Series.str.extract.html?highlight=extract#pandas.Series.str.extract
Series.str.extract(pat, flags=0, expand=True)
总共三个参数,
path
:传正则表达式
flags
: 模块中的标志re
,具体要看re
的规则了
expand
:如果为 True
,则返回每个捕获组一列的 DataFrame
。如果为 False
,如果有一个捕获组,则返回 Series/Index
;如果有多个捕获组,则返回 DataFrame
。
示例
equity_data[['total_share_capital', 'total_share_capital_unit']] = equity_data['total_share_capital'].str. \
extract('(?P<total_share_capital>\\d+\\.?\\d+)(?P<total_share_capital_unit>[\\u4e00-\\u9fa5]+)', expand=True)
这样数据列total_share_capital
中就拆分为total_share_capital
和total_share_capital_unit
两列了
P<name>
这个是正则分组命名用到的
apply(数据类型转换)
因为csv读入的数据都是字符串,所以需要数据类型转换
官方地址:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.apply.html?highlight=apply#pandas.DataFrame.apply
DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs)
func
: 传入处理数据的函数
axis
:处理数据的方向,0为列处理, 1为行处理
raw
: False返回 Series, True返回ndarray 对象(性能可能会更好)
result_type
: {‘expand’, ‘reduce’, ‘broadcast’, None}, default None
(没用过,不知道到底啥情况)
axis=1这些仅在(列)时起作用:
expand
: 类似列表的结果将变成列。
reduce
:如果可能,返回一个系列,而不是扩展类似列表的结果。这与“扩展”相反。
broadcast
: 结果将被广播到DataFrame的原始形状,原始索引和列将被保留。
默认行为(无)取决于应用函数的返回值:类似列表的结果将作为这些结果的系列返回。但是,如果应用函数返回一个系列,这些将扩展为列。
用apply
可以快速对某一列进行类型转换
equity_data['total_share_capital'] = equity_data['total_share_capital'].apply(lambda x: float(x))
这样就可以字符串转float
map(单位换算)
单位有的是亿和万,需要对数据进行下处理
万和亿转成亿,需要除以10000
首先定义个函数
def unit_charge(x, y):
if y == '万':
return x / 10000.0
else:
return x
# 进行换算
equity_data['a_total_share_capital'] = list(map(lambda x, y: unit_charge(x, y),
equity_data['a_total_share_capital'],
equity_data['a_total_share_capital_unit']))
replace(替换无意义字符)
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.replace.html?highlight=replace#pandas.DataFrame.replace
DataFrame.replace(to_replace=None, value=NoDefault.no_default, inplace=False, limit=None, regex=False, method=NoDefault.no_default)
这个就不解释参数意义了
equity_data = equity_data.replace(to_replace=np.nan, value='0')