鍍金池/ 問答/數(shù)據(jù)分析&挖掘  Python/ pandas中如何將列中數(shù)據(jù)進行轉(zhuǎn)換,如4.6k => 4600?

pandas中如何將列中數(shù)據(jù)進行轉(zhuǎn)換,如4.6k => 4600?

源數(shù)據(jù) 原類型 期望值
4.6k object 4600
2k object 2000
5.9k object 5900

嘗試過使用一下方法

  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'])

結(jié)果:

clipboard.png

求大神幫忙指定下

回答
編輯回答
負我心

map函數(shù)返回的是一個生成器,你要把這個生成器初始化后再賦值給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中運行出來看看能不能賦值,再進程序跑
你也可以把數(shù)據(jù)發(fā)給我,我?guī)湍銓懞?因為沒具體的數(shù)據(jù),我也不知道會出現(xiàn)啥情況2333333

apply函數(shù)我沒用過,學習了,我研究下,我用pandas用的也不多
多嘴一句:別迭代DataFrame,一般比較慢,迭代numpy的ndarry會快很多,原來寫程序發(fā)現(xiàn)的坑

2017年6月20日 06:45
編輯回答
別傷我
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)
2018年7月1日 23:49