Python 如何避免代码重复和冗余
我试图简化一些代码,这些代码执行以下操作:Python 如何避免代码重复和冗余,python,pandas,Python,Pandas,我试图简化一些代码,这些代码执行以下操作: 创建一个空列表,用于存储从一个网站上获取的信息 应用函数来填充列表 在数据框中添加这些信息 重复该过程,选择尚未刮除的元件 这个过程看起来像 list1 = [] def fun(df): for x in df['Col']: url = "my_website"+x soup = BeautifulSoup(requests.get(url).content, "html
- 创建一个空列表,用于存储从一个网站上获取的信息
- 应用函数来填充列表
- 在数据框中添加这些信息
- 重复该过程,选择尚未刮除的元件
list1 = []
def fun(df):
for x in df['Col']:
url = "my_website"+x
soup = BeautifulSoup(requests.get(url).content, "html.parser")
...
list1.append(data1)
return list1
list1 = fun(my_df)
my_df['List1'] = list1
(我试图让代码尽可能简单)
输出如下所示(列Col
是我的初始数据帧,即my_df
):
然后,我对每行列表中的字符串重复此过程:
# 2nd round
list1 = []
my_df2 = my_df.explode('List1')
my_list2 = pd.Series(list(set(my_df2['List1']) - set(my_df['Col'])), name='Col')
new_df2 = pd.DataFrame(my_list2, columns=['Col'])
list1 = fun(new_df2)
new_df2['List1'] = list1
然后我有另一个带有其他值的数据帧,所以我将这些结果附加到我的原始数据帧,my_df
my_df2= my_df.append(new_df2)
我再次重复这个过程
# 3rd round
list1 = []
my_df3 = my_df2.explode('List1')
my_list3 = pd.Series(list(set(my_df3['List1']) - set(my_df2['Col'])), name='Col')
new_df3 = pd.DataFrame(my_list3, columns=['Col'])
list1 = fun(new_df3)
new_df3['List1'] = list1
以此类推,直到我完成所有数据的搜集
由于我每次都手动重复这些“循环”,我想问您是否有办法简化代码以避免所有这些可怕的重复。
任何提示都将不胜感激
编辑:我的困难在于设置一个条件,如果我有我的原始数据集,即在创建列List1之前,创建空列表List1,然后对我的数据集应用fun
在其他步骤中,我应该:
- 再次初始化列表1,通过分解原始(现在更新)数据集中的列,从列表1获取新的数据帧)
- 计算此新数据帧与上一个数据帧之间的差异,以删除重复项
- 再次运行fun,将结果存储在列列表1中
- 将结果附加到更新的数据帧(始终是前一个数据帧)
- 再次重复这个过程
如果您需要更多信息,我很乐意提供。从
my_df
中我可以看出,列表1声明应该在fun
中,或者您正在其他地方清空它
首先,我将fun
更改为只处理一个条目(而不是整个系列):
然后,您可以通过执行以下操作进行第一次转换(填充第二列List1):
my_df['List1'] = my_df.Col.apply(lambda x: fun(x))
在此之后,您可以执行以下操作:
while scraping_to_do:
newCol = pd.Series(list(set(my_df['List1']) - set(my_df['Col'])))
newList1 = newCol.apply(lambda x: fun(x))
my_df = my_df.append(pd.DataFrame(dict('Col'=newCol, 'List1'=newList1)), ignore_index=True)
my_df = my_df.explode('List1')
您需要确定何时停止刮取(当集合差异为空集合时?),以及处理从空列表中产生的NAN。不幸的是,您的代码中存在一些不正常工作的内容,因为我得到了类似的
([[狗、马、猫])
而不是像这样的列表[狗、马、猫]
。你能告诉我怎么修吗?我不明白是什么导致了这个问题。我认为解决方案是将列表展平,但我希望已经有了上面代码中的列表,而不是在函数之外的其他步骤中进行。多谢了,这取决于你从网站上到底提取了什么。您可能需要更改fun
以始终输出类似[[狗、马、猫]、[鼠标]]的列表。在您的原始代码中,fun(my_df)
的输出是什么?
my_df['List1'] = my_df.Col.apply(lambda x: fun(x))
while scraping_to_do:
newCol = pd.Series(list(set(my_df['List1']) - set(my_df['Col'])))
newList1 = newCol.apply(lambda x: fun(x))
my_df = my_df.append(pd.DataFrame(dict('Col'=newCol, 'List1'=newList1)), ignore_index=True)
my_df = my_df.explode('List1')