我有一堆URL存储在数据框中,我通过url解析模块清理它们。我遇到的问题是,应该使用已清理的网址更新的“siteClean”字段是更新整个列而不是单个单元格...
以下是代码:
results = resultsX.copy(deep = True)
results = results.reset_index(drop = True)
results['siteClean'] = ''
from urlparse import urlsplit
import re
for row in results.iterrows():
#print row[1]
url = row[1][1]
if not re.match(r'http(s?)\:', url):
url = 'http://' + url
parsed = urlsplit(url)
host = parsed.netloc
#print host
#row[1][1] = host
#results[row][1] = host
results['siteClean'] = host
print results
答案 0 :(得分:2)
一般情况下,最好避免在帧的行上循环,如果可以避免的话。如果我正确理解您的问题,您需要查看框架中的单个列,并对该列的每个元素应用一个函数。然后,您希望将所有这些函数调用的结果放入原始帧的列中。也许是一个新专栏,可能代替旧专栏。这听起来像是pd.Series.map
的工作。
import pandas as pd
import numpy as np
np.random.seed(0)
n=10
df = pd.DataFrame({'num': np.random.randn(n),
'lett': np.random.choice(
list('abcdefghijklmnopqrstuvwxyz'),n)
})
df
看起来像这样:
设置一个函数,将单个字母分类为辅音或元音:
def classify_letter(char):
if char in list('aeiou'):
return 'vowel'
else:
return 'consonant'
然后,您可以使用map
生成新的Series
,其条目是由指定函数转换的输入。你可以在任何你喜欢的地方坚持使用新的输出系列。它可以是新列(在您的旧DataFrame
或其他位置),也可以替换旧列。请注意,map
仅适用于Series
,因此请务必在使用之前选择一列:
df['new'] = df['lett'].map(classify_letter)
给出:
如果您从原始设置开始并运行:
df['lett'] = df['lett'].map(classify_letter)
然后你将用新的列替换旧列: