проверка фрейма данных, если условие соответствует соответствующему значению - PullRequest
0 голосов
/ 04 мая 2020

Допустим, у меня есть фрейм данных, например:

    print(df)

    category size
    large 100
    small 10
    medium 50
    small 10
    medium 40
    large 120

Я хочу проверить между категорией и размером, имеет ли размер точное значение, соответствующее категории.

large == 100, medium == 50 and small == 10.

Я хочу использовать приведенный ниже синтаксис:

for df_index, df_line in df.iterrows():

И если строка имеет несоответствие, то оставьте эту строку, в противном случае, отбросьте хорошо подобранную строку. Вывод должен быть таким: print (df)

    category size
    medium 40
    large 120

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вот один на основе вашего вопроса; это основа c, но легко понять:

import pandas as pd

size_chart = {'large':100, 'medium': 50, 'small': 10}
data = {'category': ['large', 'small', 'medium', 'small', 'medium', 'medium'], 'size': [100, 10, 50, 10, 50, 100] } 
df = pd.DataFrame (data, columns = ['category','size'])
rows_list = []
for df_index, df_line in df.iterrows():
    if df_line['size'] != size_chart[df_line['category']]: rows_list.append( {'category':df_line['category'],'size':df_line['size']} )
df2 = pd.DataFrame (rows_list, columns = ['category','size'])
print (df2)

Отпечатки:

  category  size
0   medium   100
1 голос
/ 04 мая 2020

Даже если вы попросите решение, используя iterrows, я дам вам способ не использовать его. Метод iterrows очень прост в использовании, но приводит к немасштабируемому коду, потому что это дорогостоящая операция в pandas. Насколько это возможно, вы должны стараться использовать векторизованные методы, которые используют C оптимизированный код. Здесь вы можете:

  1. построить опорный кадр данных

    ref = pd.DataFrame([['large', 100], ['medium', 50], ['small', 10]],
               columns=df.columns)
    
  2. объединить его в исходный кадр данных и сохранить строки с несовпадающими значениями:

    df.merge(ref, how='left', on='category', suffixes=('', '_ref')).query(
        "size != size_ref")[['category', 'size']]
    

Дает, как и ожидалось:

  category  size
4   medium    40
5    large   120
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...