2017-07-04 59 views
0

我有这样一个数据帧:如何在熊猫的字符串上执行计算?

Country  Sales Assets 
China  4B  320B 
China  3B  125B 
India  112M  100B 
USA   39M  200B... 

销售资产产生列在数十亿一些价值观和一些百万。数十亿表示为B和数百万为M。现在我想检查一个国家的总销售额,但我不能这样做,因为值为对象类型。所以我从列中剥离了B,并尝试将它们转换为float值。但是像39M这样的值会导致问题。

由于1十亿 = 十亿,我想要的值百万转换为在数十亿美元。像这样的值39M应该转换为0.039B。所以后来我可以去除所有的B的并将它们转换为浮动。

我该怎么做?

+1

为什么不能你只需用正确数量的零代替'B'和'M'? – DeepSpace

+0

为什么不使用*数字类型*作为*数字数据*? –

回答

0

我觉得你可以在billion■如果需要输出使用:

  • apply因为lambda函数处理多个列
  • 首先除去由最后一个字符indexing with str并转换为int
  • 倍数的dict
  • 最后与replace d值,如果你想更改为数字,只改变dict值转换为floatastype

cols = ['Sales','Assets'] 
d = {'M': 10**-3, 'B':1} 
df[cols] = df[cols].apply(lambda x: x.str[:-1] 
            .astype(int).mul(x.replace(d, regex=True)) 
            .astype(float)) 
print (df) 
    Country Sales Assets 
0 China 4.000 320.0 
1 China 3.000 125.0 
2 India 0.112 100.0 
3  USA 0.039 200.0 

d = {'M': 10**6, 'B':10**9} 
#same solution 
print (df) 
    Country   Sales  Assets 
0 China 4.000000e+09 3.200000e+11 
1 China 3.000000e+09 1.250000e+11 
2 India 1.120000e+08 1.000000e+11 
3  USA 3.900000e+07 2.000000e+11 
0

像这样的东西应该工作

data=df['Sales'] 

for value in data: 

    char=value[-1] 

    if char=='M' 

     toadd=float(value[:-1]/1000.0) 

    elif char=='B': 
     toadd=float(value[:-1]) 

    totalsales=totalsales+toadd