Python — манипулирование числами для округления числа и создания нового столбца?

#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 «

  1. Я создал ряд s , который по существу подсчитывает, сколько там цифр, которые вы будете использовать на следующем шаге, чтобы добавить это количество нулей.
  2. При создании 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 кстати, ответ Скотта намного лучше, так что не стесняйтесь принять это.