作者ccwang002 (亮)
看板Python
标题Re: [问题]scrapy如何把抓到的资料存成这样格式?
时间Thu Feb 12 00:33:13 2015
※ 引述《allen511081 (蓝)》之铭言:
: ※ 引述《allen511081 (蓝)》之铭言:
: : 各位好,小弟上次抓的资料格式已经如我上次发问的样子
: : title birdName count
: : XXX yyy zzz
: : XXX yyy zzz
: : XXX yyy zzz
: : XXX yyy zzz
: : 但是我现在想要把格式改成以下的样子,这样可以方便以後的处理
: : title title title title birdName count birdName count birdName count
: : XXX XXX XXX XXX yyy zzz yyy zzz yyy zzz =>为一笔
: : 後面的birdName和count是依据网页资料的笔数决定,每个网页的笔数不一定,
用了原 po 提供的范例档,底下是好读完整版
http://nbviewer.ipython.org/gist/ccwang002/6b51ae21a91cba13c2ef/Transform.ipynb
我是用 Python 3.4 跑的,2.x 要注意一下 unicode 的转换。
你爬下的内容有 \ufeff 之类的字元没有清,要小心栏位不要处理错,
我有特别独立出来成输入的参数 (obs_cols) 。
import pandas as pd
def flatten_obs(bird_obs, obs_cols, preserved_cols=None):
"""Flatten brid observations into one row record."""
keep_cols = preserved_cols if preserved_cols else []
# assume values preserved columns don't change
keep_values = list(bird_obs.loc[0, keep_cols].values)
# flatten bird observation
flatten_obs = []
flatten_cols = []
for bird_ix, (bird, count) in (
bird_obs.loc[:, obs_cols].iterrows()
# extract wanted columns
):
flatten_obs.extend([bird, count])
# create incremental column suffix, starting 0
flatten_cols.extend([
'bridName_%d' % bird_ix,
# birdName_0, ...
'count_%d' % bird_ix,
# count_0, ...
])
# join kept and flatten columns as DataFrame
return pd.DataFrame(
[keep_values + flatten_obs],
# nested list required by DataFrame
columns = keep_cols + flatten_cols
)
使用的话,
orig_df = pd.read_csv('./items.csv')
obs_cols = ['birdName', 'count']
preserved_cols = ['weather', 'location', 'time', 'date', 'birdCondition']
flatten_df = flatten_obs(orig_df, obs_cols, preserved_cols)
合并 flatten_df 的话可以用 pandas.concat,重覆的就放在一起,
遇上没有的栏位,就会自动补 NaN 值(相当於对不同记录的栏位做 OUTER JOIN)
用法:
pd.concat(flatten_df_list)
我觉得你在爬的时候那些 preserved_cols 值并不会重覆出现,应该是你额外加的,
所以现在有种做两次功(重覆->去重覆)的感觉,也许可以重想一下程式的流程。
这个版本的 code 为了好读和方便可能不是最有效的方式,
也尽量不用 Numpy 函式来处理,因为不确定你对它的熟悉度。
pd.concat 可以完全不用,因为合并的栏位长什麽可以很简单的预测(最多几只鸟)
这样就能预先建立好一个矩阵。
CSV 我直接读有格式错误,我使用的档案都放在
https://gist.github.com/6b51ae21a91cba13c2ef
--
以後不玩程式码上色了…
PyCon APAC 2015 Call for Proposals!
https://tw.pycon.org/2015apac/en/
也诚徵志工喔(站内信或
[email protected])
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.44.9.45
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1423672403.A.E89.html
※ 编辑: ccwang002 (114.44.9.45), 02/12/2015 00:37:33