双循环中的无限负载



因此,我编写了一种方法,通过双循环删除DataFrame的多行,该双循环将检查并比较每一行与所有其他行:

catalogo0 = []
df6 = reviews.drop(reviews.columns[[4, 5, 6]], axis=1)
for i in range(len(df6)):
estilo_culinario = ast.literal_eval(df6['Estilo Culinário'][i])
for x in estilo_culinario:
linha = ['{}'.format(df6['Nome'][i]), '{}'.format(df6['Cidade'][i]), '{}'.format(x), '{}'.format(df6['Ranking'][i])]
catalogo0.append(linha)
df6b = pd.DataFrame(catalogo0, columns = ['Nome', 'Cidade', 'Estilo', 'Ranking'])
df6b.dropna(inplace=True)
for j in range(len(df6b)):
for k in range(len(df6b)):
if df6b['Cidade'][j] == df6b['Cidade'][k] and df6b['Estilo'][j] == df6b['Estilo'][k] and float(df6b['Ranking'][j]) >= float(df6b['Ranking'][k]):
df6b.drop(j, inplace=True)
df6c = df6b.drop(df6b.columns[[2]], axis=1)
df6c

但通过这样做,我得到了一个无限的负载,它似乎并没有结束,我想这是双循环的一个原因。那么,我该怎么解决这个问题呢?有没有一种方法可以更有效地比较df的每一行?因为我们谈论的是大约有30000行的df,所以上的处理非常麻烦

事实上,您的代码非常复杂,2个嵌套循环+drop,所以它的O(n3(
相反,您可以尝试这种简单的方法:

import pandas as pd
import json
def drop_duplicate(df: pd.DataFrame):
json_data = json.loads(df.to_json(orient="records"))
unique_records = set([json.dumps(record) for record in json_data])
return pd.DataFrame(data=[json.loads(str_record) for str_record in unique_records])[df.columns]
df = pd.DataFrame([
{
"x": 1,
"y": 1,
},
{
"x": 1,
"y": 1,
},
{
"x": 1,
"y": 2,
},
])
print(drop_duplicate(df).head(10))

解释

在python中消除重复数据的最佳方法之一是使用set,set在数据上循环,对数据进行散列,并只保留一个重复行的实例
但是系列是不可破解的,为此,我建议将数据帧转换为json-str,将json加载为python字典列表,然后转储每个字典(转换为字符串(,让集合对其进行哈希并添加它。
一旦创建了集合,我们就可以将唯一的字符串重新转换为字典,并在列表中提供给pd.DataFrame,以创建新的数据帧。在这种方法中,列的顺序可能会改变,为此,最后可以选择new_df[df.columns]以获得与输入数据帧相同的顺序。

这个解决方案可能看起来很复杂,但事实并非如此,它的复杂性是O(n(。您只需要一些额外的内存来加载数据并创建不同的数据结构。

相关内容

  • 没有找到相关文章

最新更新