#python #pandas #numpy #dataframe #jupyter-notebook
#python #pandas #numpy #фрейм данных #jupyter-ноутбук
Вопрос:
У меня есть следующий вопрос, который я хотел бы задать:
ПРИМЕР:
INITIAL DATA
DATE EMAIL SALE
10/2/2020 ABC@gmail.com $ 501.00
10/2/2020 123@gmail.com $ 100.00
10/2/2020 test@gmail.com $ 50.00
10/2/2020 example@gmail.com $ 32.00
10/2/2020 ABC@gmail.com $ 501.00
10/3/2020 test@gmail.com $ 45.00
10/3/2020 123@gmail.com $ 75.00
10/3/2020 example@gmail.com $ 100.00
10/4/2020 example@gmail.com $ 200.00
DESIRED OUTPUT
DATE EMAIL SALE CHECKED LEFT?
10/2/2020 ABC@gmail.com $501.00 $500.00 $1.00
10/2/2020 123@gmail.com $100.00 $100.00 $0.00
10/2/2020 test@gmail.com $50.00 $50.00 $0.00
10/2/2020 example@gmail.com $32.00 $30.00 $2.00
10/2/2020 ABC@gmail.com $501.00 $500.00 $1.00
10/3/2020 test@gmail.com $45.00 $40.00 $5.00
10/3/2020 123@gmail.com $75.00 $70.00 $5.00
10/3/2020 example@gmail.com $100.00 $100.00 $0.00
10/4/2020 example@gmail.com $200.00 $200.00 $0.00
Я хочу создать новые столбцы в качестве счетчика, чтобы отметить, является ли это гладким числом, которое заканчивается круглым числом — НАПРИМЕР, 10, 500, оно будет подсчитано и помещено в столбец с именем checked . Тогда оставшиеся продажи будут помещены в столбец с именем left? и счетчик, указывающий, было ли оно подсчитано или нет.
Я новичок в манипулировании данными в python, поэтому я не уверен, что я могу даже Google для этого.
Любая помощь будет оценена или, если у вас, ребята, тоже есть предложения!
Спасибо!
Комментарии:
1. Привет, не могли бы вы опубликовать код своих попыток до сих пор?
2. Эй, я даже не знаю, с чего начать, потому что я не знаю, что искать — Если есть что-нибудь, что вы можете предложить, это было бы здорово!
3. Почему строка 2 учитывается, а строка 3 нет?
4. о, извините, это ошибка! — исправлено!
Ответ №1:
Попробуйте это:
df['SalesNum'] = df['SALE'].str.strip('$').astype(float)
df['MARKED'] = (df['SalesNum'] // 10) * 10
df['LEFT$'] = df['SalesNum'] % df['MARKED']
df['COUNTED'] = (df['MARKED'] > 0).astype(int)
df
Вывод:
DATE EMAILID SALE SalesNum MARKED LEFT$ COUNTED
0 10/2/2020 ABC@gmail.com $ 501.00 501.0 500.0 1.0 1
1 10/2/2020 123@gmail.com $ 100.00 100.0 100.0 0.0 1
2 10/2/2020 test@gmail.com $ 50.00 50.0 50.0 0.0 1
3 10/2/2020 example@gmail.com $ 32.00 32.0 30.0 2.0 1
4 10/2/2020 ABC@gmail.com $ 501.00 501.0 500.0 1.0 1
5 10/3/2020 test@gmail.com $ 45.00 45.0 40.0 5.0 1
6 10/3/2020 123@gmail.com $ 75.00 75.0 70.0 5.0 1
7 10/3/2020 example@gmail.com $ 100.00 100.0 100.0 0.0 1
8 10/4/2020 example@gmail.com $ 200.00 200.0 200.0 0.0 1
Подробные сведения:
- Сначала давайте очистим строку в столбце «ПРОДАЖИ» от знака доллара, используя
.str
, средство доступа к строке иstrip
и приведение этого результата к типу данных с плавающей запятой и присвоим его столбцу «SalesNum». - Далее мы можем использовать
//
разделение по этажам, чтобы получить целое число, которое 10 раз будет равномерно распределено по столбцу ‘SalesNum’. И мы умножаем этот результат на 10, чтобы получить «ПОМЕЧЕННЫЙ». - Теперь мы можем использовать
%
оператор modulo, чтобы получить остаток после того, как мы разделим ‘SalesNum’ на ‘MARKED’. - Наконец, мы присваиваем 1 значению «подсчитано», если какое-либо значение, большее нуля, было присвоено «ПОМЕЧЕНО».
Комментарии:
1. Спасибо!! Я думаю, это работает!! Не могли бы вы немного объяснить, что вы здесь сделали — df[‘SalesNum’] % df[‘MARKED’] — как это позволило нам получить напоминание?
2. @user13904208 Спасибо. Я планировал добавить это объяснение, но меня отвлекли мои дети. Вот оно, я надеюсь, это поможет. Будьте в безопасности и будьте здоровы.
3. Большое спасибо за вашу помощь, Скотт! Это было действительно информативно!
Ответ №2:
Вы могли бы преобразовать в строку и выполнить некоторые строковые манипуляции, заменив последнюю цифру на 0, а затем преобразовать обратно в int «
- Я создал ряд
s
, который по существу подсчитывает, сколько там цифр, которые вы будете использовать на следующем шаге, чтобы добавить это количество нулей. - При создании
MARKED
столбца я взял первую цифру с.str[0]
и добавил необходимое количество нулейs
.
# df['SALE'] = df['SALE'].replace(['$', '..*'], '', regex=True).str.strip().astype(int)
s = (df['SALE'].astype(str).map(len) - 1).apply(lambda x: x * '0')
df['MARKED'] = (df['SALE'].astype(str).str[0] s).astype(int)
df['LEFT$'] = df['SALE'] - df['MARKED']
df
Out[1]:
DATE EMAILID SALE MARKED LEFT$
0 10/2/2020 ABC@gmail.com 501 500 1
1 10/2/2020 123@gmail.com 100 100 0
2 10/2/2020 test@gmail.com 50 50 0
3 10/2/2020 example@gmail.com 32 30 2
4 10/2/2020 ABC@gmail.com 501 500 1
5 10/3/2020 test@gmail.com 45 40 5
6 10/3/2020 123@gmail.com 75 70 5
7 10/3/2020 example@gmail.com 100 100 0
8 10/4/2020 example@gmail.com 200 200 0
Комментарии:
1. что, если последняя цифра не равна 0, например, 539 — как бы вы тогда справились с 39?
2. @user13904208 вы пытаетесь взять слово или, если выше 5, вы бы округлили? В строке с 45 вы округлили до 40, поэтому я предположил, что вы выступаете. 539 станет 530. Станет ли 539 500?
3. да — я пытаюсь сохранить его до 500, или 300, или 200, или 100, а не с 549 или 583
4. интересно — если вы не возражаете, можете ли вы немного объяснить, что вы сделали? Я думаю, я вижу это, когда вы разделяете str, а затем применяете 0 к str?
5. @user13904208 кстати, ответ Скотта намного лучше, так что не стесняйтесь принять это.