Как удалить определенные значения последовательно в кадрах данных панд? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть несколько 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)]

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

почему мой код не работает

Когда вы вызываете

for i, ii in df_dict.items()

python, создайте 2 переменные i и ii, назначенные ключу и кадру данных.
В то же время, ваши df1, df2, df3, df_dict не меняются (во время первого цикла ii и df1 ссылаются на один и тот же объект данных, но они по-прежнему две разные переменные).

ТогдаСледующее выражение создает другой объект 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
0 голосов
/ 01 июня 2018

Во-первых, вы должны использовать словарь или список для хранения множества похожих структурированных фреймов данных и не заполнять вашу глобальную среду отдельными фреймами данных.Всегда используйте контейнер для организации и настройте выполнение массовых операций, таких как pd.concat, для создания мастер-набора.Но обязательно назначайте кадры данных словарю напрямую, а не создавайте отдельные объекты.

По той причине, что кадры данных словаря не обновляются, если вы их неправильно назначаете.Каждый экземпляр 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)]

В качестве альтернативы используйте элемент значения цикла словаря, но переназначьте временные изменения текущего индекса, как @ phi объясняет .

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

    df_dict[k] = v
0 голосов
/ 01 июня 2018

Вы, вероятно, не должны создавать словарь фреймов.Но если вы это сделали, вы должны использовать следующий код для изменения словаря:

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)] назначает измененный фрейм данных переменной ii, но эта переменная перезаписывается в следующем циклеитерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...