【问题标题】:Divide by a number only non Nan values in a data frame column仅除以数据框列中的数字非 Nan 值
【发布时间】:2021-12-28 15:13:12
【问题描述】:

假设我有一个如下所示的数据框:

       Col1
0    100,000,000
1    234,343,000
2      NaN
3    213,564,545
4      NaN
5    678,000
6     200

如何将 Col1 中的非 NaN 值除以 1000 并获得理想的输出:

        Col1            Col2
0    100,000,000      100,000
1    234,343,000      234,343
2        NaN            NaN
3    213,564,545      213,564
4        NaN            NaN
5      678,000          678
6     200               0.2

我尝试做 df['Col1'].div(1000) 但由于 NaN 值而无法正常工作

【问题讨论】:

  • 你有整数还是字符串?

标签: python python-3.x pandas dataframe


【解决方案1】:

看起来你有字符串,所以除以 1000 只是删除最后一个逗号和最后 3 位数字。您可以使用正则表达式:

df['Col2'] = df['Col1'].str.replace(',?\d{,3}$', '', regex=True)

输出:

          Col1     Col2
0  100,000,000  100,000
1  234,343,000  234,343
2          NaN      NaN
3  213,564,545  213,564
4          NaN      NaN
5      678,000      678

模拟真正的除法:

只有小数字作为浮点数
df['Col2'] = df['Col1'].str.replace(r'(.*?)(,?(\d{1,3}))$',
                                    lambda m: m.group(1) if m.group(1) else ('0.'+m.group(3).zfill(3)),
                                    regex=True)

输出:

          Col1     Col2
0  100,000,000  100,000
1  234,343,000  234,343
2          NaN      NaN
3  213,564,545  213,564
4          NaN      NaN
5      678,000      678
6           23    0.023
所有浮动
df['Col2'] = df['Col1'].str.replace(r'(.*?)(,?(\d{1,3}))$',
                                    lambda m: (m.group(1) if m.group(1) else '0')+'.'+m.group(3).zfill(3),
                                    regex=True)

输出:

          Col1         Col2
0  100,000,000  100,000.000
1  234,343,000  234,343.000
2          NaN          NaN
3  213,564,545  213,564.545
4          NaN          NaN
5      678,000      678.000
6           23        0.023

【讨论】:

  • 嘿@mozway,是的,它们是字符串,我为我的示例尝试了您的解决方案,因为它运行良好。但是如果数字(字符串)像“200”并且我想在输出中得到的是 0.2。使用您的解决方案,它将从行中删除该字符串。这个怎么解决
  • 编辑了我的问题,添加了索引为 6 的行。你能检查一下吗?
  • @user14073111 是不是故意让213,564,545 不变成213,564.545
  • 是的 213,564,545 应该是 213,564.545,所以我担心我们是否只删除最后 3 位数字
  • @user14073111 我提供了所有可能性,所以现在你可以选择;)
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多