pandas中如何将列中数据进行转换,如4.6k => 4600?

发布于 2022-09-06 12:39:27 字数 2478 浏览 8 评论 0

源数据原类型期望值
4.6kobject4600
2kobject2000
5.9kobject5900

尝试过使用一下方法

  1. pandas.apply()
def f(x):
    if('k' in str(x)):
        return float(x[:-1]) * 1000
    return x
df['views'] =df[['view']].apply(f)

错误提示

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-123-a88a6b015fcb> in <module>()
      3         return float(x[:-1]) * 1000
      4     return x
----> 5 df['views'] =df[['view']].apply(f)

~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in apply(self, func, axis, broadcast, raw, reduce, args, **kwds)
   4260                         f, axis,
   4261                         reduce=reduce,
-> 4262                         ignore_failures=ignore_failures)
   4263             else:
   4264                 return self._apply_broadcast(f, axis)

~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in _apply_standard(self, func, axis, ignore_failures, reduce)
   4356             try:
   4357                 for i, v in enumerate(series_gen):
-> 4358                     results[i] = func(v)
   4359                     keys.append(v.name)
   4360             except Exception as e:

<ipython-input-123-a88a6b015fcb> in f(x)
      1 def f(x):
      2     if('k' in str(x)):
----> 3         return float(x[:-1]) * 1000
      4     return x
      5 df['views'] =df[['view']].apply(f)

~/anaconda3/lib/python3.6/site-packages/pandas/core/series.py in wrapper(self)
     95             return converter(self.iloc[0])
     96         raise TypeError("cannot convert the series to "
---> 97                         "{0}".format(str(converter)))
     98 
     99     return wrapper

TypeError: ("cannot convert the series to <class 'float'>", 'occurred at index view')
  1. map()
def f(x):
    if('k' in str(x)):
        return int(x[:-1]) * 1000
    return x
df['views'] = map(f,df['view'])

结果:

clipboard.png

求大神帮忙指定下

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

请帮我爱他 2022-09-13 12:39:27

map函数返回的是一个生成器,你要把这个生成器初始化后再赋值给df:

def f(x):
    if('k' in str(x)):
        return int(x[:-1]) * 1000
    return x
# 初始化为list再赋值
df['views'] = list(map(f,df['view']))

如果不行你再试试

df['views'] = np.array(list(map(f,df['view'])))

反正就是这个意思,你可以先在ipython中运行出来看看能不能赋值,再进程序跑
你也可以把数据发给我,我帮你写好,因为没具体的数据,我也不知道会出现啥情况2333333

apply函数我没用过,学习了,我研究下,我用pandas用的也不多
多嘴一句:别迭代DataFrame,一般比较慢,迭代numpy的ndarry会快很多,原来写程序发现的坑

回心转意 2022-09-13 12:39:27
s = ['4.6k', '2k', '5.9k']
df = pd.DataFrame(s, columns=['s'])
df['s_format']= df['s'].apply(lambda x: float(x[:-1])*1000 if 'k' in x else x)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文