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')