2020-04-30 10:50:00 by scott
数据处理预处理数据是使用数据的必要步骤。
这里使用pandas进行处理,效率虽然不是最优的,但方便性还是显而易见的。
场景:
从网页上(通过requests抓取一个json包)下载的一堆数据,是个字典列表。现在要把它转换后存储到自己的MySQL库里。需要处理为:转换字段名称、修改字段类型、去除字段前后的空字符、转换字符串为float。
数据结构:
[
{"时间": "2020-04-30", "广告展示数": 1240, "点击量": 65, "预计收入": 21,
"广告位ID": "2050238408812559", "广告位": "应用A-安卓-01", "千次展示收益": 1.2},
{"时间": "2020-04-30", "广告展示数": 1540, "点击量": 85, "预计收入": 31,
"广告位ID": "2050238408812000", "广告位": "应用A-安卓-02", "千次展示收益": 1.3}
]
COLUMON = {"时间": "date_time", "广告位": "union_position_name", "广告位ID": "union_position_id",
"广告展示数": "display_pv",
"点击量": "click_pv", "预计收入": "cost", "千次展示收益": "union_ecpm"}
df = pd.DataFrame(data)
# 修改字段名,设置inplace=True则会在原dataframe中替换
df.rename(columns=COLUMON, inplace=True)
# 为了防止出现赋值警告,这里复制出来一份
df = df[COLUMON.values()].copy()
# 把2020/04/30转换为2020-04-30
df['date_time'] = df['date_time'].map(lambda x: x.replace("/", "-"))
# 把字符串类型的数字转为浮点型,同时处理数字中的逗号
for col in ['display_pv', 'click_pv', 'cost', 'union_ecpm']:
if df.dtypes[col] == np.dtype(np.object):
df[col] = df[col].map(lambda x: float((x.replace(",", "") if isinstance(x, str) else x)))
# 去除字符串前后的空字符
df["union_position_name"] = df["union_position_name"].map(lambda x:x.strip())
# 把字段转换为字符串
df['union_position_id'] = df['union_position_id'].astype(str)
虽然这个方法速度不一定是最快,但操作起来肯定是最方便的。