将函数应用于数据框
我目前有以下数据框:
数据
url visitors
http://somedomain.com 200000
http://someotherdomain.com 150000
http://somenewdomain.com 11000
对于数据框中的每一行,我喜欢将两个函数应用于url列,然后将每个结果写入两个不同的列“元”和“内容”。
功能
:def metacrawler(url)
...
return data
def contentcrawler(url)
...
return data
# Counter
progress = 0
循环
for index, row in data.iterrows():
print(str(progress)," out of ",str(len(data)))
print('Starting meta crawling.')
row['meta'] = metacrawler(row["url"])
print('Starting content crawling.')
row['content'] = contentcrawler(row["url"])
print('Complete.')
progress += 1
但是,当我在几次迭代后中止该过程时,我发现没有数据写入数据帧。也没有创建任何列。
我做错了什么?
解决方案
def func(row):
print("Crawling Meta")
meta = metacrawler(row["url"])
print("Crawling Content")
tags = contentcrawler(row["url"])
return meta, content
data[['meta', 'content']] = data.apply(func, axis=1, result_type='expand')
答案 0 :(得分:2)
您可以将.apply()
函数Docs与result_type='expand'
一起使用
In [3]: df = pd.DataFrame({'one':[1,2,3,4], 'two':[5,6,7,8]})
In [4]: df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')
Out[4]:
0 1
0 6 6
1 8 8
2 10 10
3 12 12
In [5]: df[['new', 'etc']] = df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')
In [6]: df
Out[6]:
one two new etc
0 1 5 6 6
1 2 6 8 8
2 3 7 10 10
3 4 8 12 12
编辑: 如果要显示进度,请分别定义应用的功能,即
def func(row):
print(row)
return sum(row), sum(row)
In [3]: df = pd.DataFrame({'one':[1,2,3,4], 'two':[5,6,7,8]})
In [4]: df.apply(func), axis=1, result_type='expand')
Out[4]:
0 1
0 6 6
1 8 8
2 10 10
3 12 12
In [5]: df[['new', 'etc']] = df.apply(lambda x: (sum(x), sum(x)), axis=1, result_type='expand')
In [6]: df
Out[6]:
one two new etc
0 1 5 6 6
1 2 6 8 8
2 3 7 10 10
3 4 8 12 12