如何按顺序删除数据帧中的特定值?

2024-07-04 08:06:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在字典中存储了几个pandas数据帧:

df1=pd.DataFrame({'product':['ajoijoft','bbhjbh','cser','sesrd','yfgjke','tfyfyf','drdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']})
df2=pd.DataFrame({'product':['ajyughjoijoft','bdrddbhjbh','rdtrdcser','sdtrdthddesrd','yawafgjke','tesrgsfyfyf','sresedrdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']})
df3=pd.DataFrame({'product':['joijoft','bdbhjbh','rdcser','sdhddesrd','wajke','yf','sresedrdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']})

df_dict = {"A":df1,'B':df2, "C":df3}

我想知道product中每个字符串的长度,所以我写如下。你知道吗

for i, ii in df_dict.items():
    ii['Productsize'] = ii['product'].str.len()

这是有效的,我可以得到所有“产品”的长度。你知道吗

接下来,我要删除具有短product字符串长度的行,即:Productsize < 6

我试着用这个代码:

for i, ii in df_dict.items():
    ii=ii[~(ii['Productsize'] <= 6)]

然而,这并没有起作用。 如果我像下面那样单独编写(即不在循环中),它仍然可以工作。你知道吗

df1=df1[~(df1['Productsize'] <= 6)]

有人知道问题出在哪里吗?你知道吗

我试过你们建议的。不幸的是,这不起作用。你知道为什么。。。?这是密码。你知道吗

df1=pd.DataFrame({'product':['ajoijoft','bbhjbh','cser','sesrd','yfgjke','tfyfyf','drdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']})
df2=pd.DataFrame({'product':['ajyughjoijoft','bdrddbhjbh','rdtrdcser','sdtrdthddesrd','yawafgjke','tesrgsfyfyf','sresedrdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']})
df3=pd.DataFrame({'product':['joijoft','bdbhjbh','rdcser','sdhddesrd','wajke','yf','sresedrdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']})

df_dict = {"A":df1,'B':df2, "C":df3}

for i, ii in df_dict.items():
    ii['Productsize'] = ii['product'].str.len()    

for i, ii in df_dict.items():
    df_dict[i] = ii[~(ii['Productsize'] <= 6)]

Tags: indataframedfforproductpricelabeldict
3条回答

首先,您应该使用字典或列表来保存许多相似的结构化数据帧,而不是用单独的数据帧充斥您的全局环境。始终使用容器来组织自己,并设置为运行批量操作,如pd.concat来构建主集。但要确保直接将dataframes分配给dictionary,而不是创建单独的对象。你知道吗

至于字典数据帧不更新的原因是没有正确分配。df的每个实例都需要替换为df[key]。所以

df[~(df['Productsize'] <= 6)]

将被替换为

df_dict[key][~(df_dict[key]['Productsize'] <= 6)]

当数据帧存储在容器中时,不会丢失它的任何功能,只是引用它会发生更改。因此,应相应调整:

for k, v in df_dict.items():
    df_dict[k]['Productsize'] = df_dict[k]['product'].str.len()  
    df_dict[k] = df_dict[k][~(df_dict[k]['Productsize'] <= 6)]

或者,使用dictionary循环的value项,但将对当前索引的临时更改重新分配为@phi explains。你知道吗

for k, v in df_dict.items():
    v['Productsize'] = v['product'].str.len()  
    v = v[~(v['Productsize'] <= 6)]

    df_dict[k] = v

你可能不应该建立一个框架字典。但如果是这样,则应使用以下代码修改字典:

for i, ii in df_dict.items():
    df_dict[i] = ii[~(ii['Productsize'] <= 6)]
    #df_dict[i] = ii[(ii['Productsize'] > 6)] 

语句ii = ii[~(ii['Productsize'] <= 6)]将修改后的dataframe分配给变量ii,但在下一次循环迭代中会覆盖该变量。你知道吗

为什么我的代码不起作用

当你打电话的时候

for i, ii in df_dict.items()

python创建2个变量i和ii,分配给key和dataframe。
同时,您的df1, df2, df3, df_dict没有改变(在第一个循环中,iidf1引用相同的对象dataframe,但它们仍然是两个不同的变量)。你知道吗

然后下一个表达式创建dataframe的另一个对象,将ii分配给新创建的对象。你的df1, df2, df3, df_dict仍然没有改变。你知道吗

ii = ii[~(ii['Productsize'] <= 6)]

为了改变df1,您必须显式地这样做

df1 = ii

改变df_dict

df_dict[i] = ii

您可能需要考虑变量,如tags

df1 = pd.DataFrame(...)  # Create a dataframe and give it a tag df1
ii = df1  # Give the same dataframe a tag ii
ii = ii[ii.ProductSize < 6]  # Move the tag ii to the new filtered dataframe. df1 still stucks with the first data frame

相关问题 更多 >

    热门问题