Фильтруйте фреймы данных в python, используя значения из других фреймов данных, и назначайте метки отфильтрованным значениям

#python #pandas #dataframe

Вопрос:

Я новичок в python, и мое кодирование немного подзабыто. Допустим, у вас есть два кадра данных, df1 и df2

 >>> df1 
A B
1  man
2  boy
3  girl
4  child

>>> df2 
Begin  end 
2          10
4          12
6          14
8          16
 

Я хочу использовать значения из столбцов begin и end из df2 , чтобы создать второй столбец df1 и пометить соответствующие значения как до, внутри или после. Я попробовал некоторые коды (см. Ниже). Но он не смог выполнить эту работу за меня. Я получаю ошибку » Ошибка значения: значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all()’.

 position = []
for index, row in df1.iterrows():
    if row['A'] < df2['start']:
        position.append('before')
    if row['A'] > df2['begin'] and row['A'] < df2['end']:
        position.append('within')
    if row['A'] > df2['begin'] and row['A'] > df2 ['end']:
       position.append ('after')
 d1['position'] = position
 

Комментарии:

1. Пожалуйста, покажите желаемый выходной кадр данных.

2. Под df2[«начать»] вы подразумеваете df2[«начать»] ?

3. Кстати » строка[‘A’] Pandas сравнивает значение строки[«A»] с каждым значением в столбце df2[«конец»] и возвращает столбец True/False. Отсюда ошибка Valueerror при попытке использовать результат в логическом операторе.

4. @ timeg это мой желаемый результат. Мой пример не самый лучший, но, пожалуйста, дайте мне знать, если вам нужны дополнительные разъяснения. A B C 1 мужчина до 2 мальчиков в течение 3 девочек в течение 4 детей в

5. @kubatucka я имел в виду df2 [«начать»]. Я внес исправления. Надеюсь, это сделает вопрос намного яснее.

Ответ №1:

В вашем коде много ошибок/несоответствий, но вот решение того, что, я думаю, вы пытаетесь сделать:

 df1['position'] = ''
df1['position'].loc[df1.A < df2.begin] = 'before'
df1['position'].loc[df1.A > df2.end] = 'after' 
df1['position'].loc[(df1.A <= df2.end) amp; (df1.A >= df2.begin)] = 'within'
 

Комментарии:

1. Спасибо вам за ваш ответ. Я запустил предоставленный вами код, но получил сообщение об ошибке «Ошибка значения: можно сравнивать только объекты серии с одинаковыми метками», я не упомянул, что два фрейма данных не совпадают с точки зрения индекса и номеров строк/столбцов.

2. Тогда я не понимаю. Для пяти строк A, с какой строкой в B вы хотите сравнить даты?

3. Приведенный выше пример является гипотетическим. Я хочу использовать значения из df2 (т. Е. начало и конец) и установить диапазон, который я буду использовать для присвоения меток значениям в df2. Я попытался добавить свой предполагаемый результат. Я ценю вашу помощь.