【问题标题】:Python - Manipulating numbers for a round number and create new column?Python - 为整数处理数字并创建新列?
【发布时间】:2021-02-20 23:27:43
【问题描述】:

我有以下问题想问:

示例:

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   

我想创建新列作为计数器来标记它是否是一个以大约数字结尾的平滑数字 - EX。 10, 500 它将被计算并放入名为已检查的列中。那么剩下的剩余销售额将放在一个名为left的列中吗?和一个计数器来指示它是否被计数。

我是在 python 中操作数据的新手,所以我不确定我什至可以用谷歌来做到这一点。

如果你们也有任何建议,我们将不胜感激!

谢谢!

【问题讨论】:

  • 嗨,你能把你目前尝试的代码贴出来吗?
  • 嘿 - 我什至不知道从哪里开始,因为我不知道要寻找什么 - 如果有什么你可以提出的建议那就太好了!
  • 为什么计算第 2 行而第 3 行不计算?
  • 哦,抱歉,这是个错误! - 更正了!

标签: python pandas numpy dataframe jupyter-notebook


【解决方案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

详情:

  • 首先让我们去掉美元符号“SALES”列中的字符串 使用.str、字符串访问器和strip 并强制转换 结果为浮点数据类型并将其分配给“SalesNum”列。
  • 接下来,我们可以使用// 下限来获得一个整数 10 将平均分配到“SalesNum”列的次数。 我们将该结果乘以 10 得到“MARKED”。
  • 现在,我们可以使用% 模运算符来获得我们之后的余数 将“SalesNum”除以“MARKED”。
  • 最后,如果任何大于零的值被 分配给“标记”。

【讨论】:

  • 谢谢!!我认为这行得通!你能解释一下你在这里做了什么 - df['SalesNum'] % df['MARKED'] - 这如何让我们得到提醒?
  • @user13904208 谢谢。我本来打算添加这个解释,但是我被我的孩子分心了。在这里,我希望它有所帮助。保持安全并保持健康。
  • 非常感谢斯科特的帮助!这真的很丰富!
【解决方案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

【讨论】:

  • 如果最后一位数字不是 0(例如它的 539)怎么办 - 那么您将如何处理 39 呢?
  • @user13904208 你是想发言还是如果超过 5 人你会四舍五入?在 45 的行中,你四舍五入到 40,所以我假设你正在发言。 539 会变成 530。539 会变成 500 吗?
  • 是的 - 我试图一直保持到 500 或 300 或 200 或 100 而不是 549 或 583
  • 有趣 - 如果你不介意你能解释一下你做了什么吗?我想我在拆分 str 然后将 0 应用于 str 时看到了它?
  • @user13904208 顺便说一句,Scott 的回答要好得多,所以请随意接受。
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2016-10-06
  • 2014-09-24
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多