将带有“N/As”的 DataFrame 转换为浮动以计算百分比变化

我正在尝试将以下 DataFrame(包含几个“N/As”)转换为浮动,以便我可以执行百分比更改操作:


d = pd.DataFrame({"A":['N/A','$10.00', '$5.00'], 

           "B":['N/A', '$10.00', '-$5.00']})

最后,我希望结果是:


(更新:我不想删除原始的 N/A 值。我想将它们作为占位符保留在那里。)

http://img2.mukewang.com/6162a8ff0001802903240066.jpg

因为没有处理负数的任何标志,所以我不能使用:


pct_change(-1)

所以,我需要使用:


d['A'].diff(-1)/d['A'].shift(-1).abs()

但是,我收到错误:


TypeError: unsupported operand type(s) for -: 'str' and 'str'

第一步,我试图将数据从对象/字符串转换为浮点数,但输出是意外的(对我而言)。我得到浮点数 'NaNs' 而不是实际数字。


>d['A_float'] = pd.to_numeric(d['A'], errors='coerce')

>d

        A         B  A_float

0     N/A       N/A      NaN

1  $10.00  -$100.00      NaN

2   $5.00    -$5.00      NaN

>d.dtypes

A           object

B           object

A_float    float64

dtype: object

作为一个简单的测试,我尝试从值中减去“1”,但仍然得到浮点“NaN”。


>d['A_float_minus1_test'] = pd.to_numeric(d['A'], errors='coerce')-1

>d

        A         B  A_float  A_float_minus1_test

0     N/A       N/A      NaN                  NaN

1  $10.00  -$100.00      NaN                  NaN

2   $5.00    -$5.00      NaN                  NaN


>d.dtypes

A                       object

B                       object

A_float                float64

A_float_minus1_test    float64

dtype: object

有没有一种简单的方法可以获得以下结果?我的想法是将每个DataFrame列单独更改为浮动,然后执行操作。必须有更简单的方法。


期望的输出:


(更新:我不想删除原始的 N/A 值。我想将它们作为占位符保留在那里。)

http://img4.mukewang.com/6162a90e00013af903260064.jpg

海绵宝宝撒
浏览 204回答 2
2回答

慕姐8265434

要将您的列从字符串转换为浮点数,您可以使用apply,如下所示:d['A_float'] = d['A'].apply(lambda x: float(x.split('$')[1]) if x != '' else 0.0)本x.split('$')[1]是用来去除$字符(最终前负)。然后我不确定您要做什么,但是如果您要计算 A 与 B 的百分比,则可以这样使用np.vectorize:d['Percent'] = np.vectorize(percent)(d['A'],d['B'])def percent(p1, p2):     return (100 * p2) / p1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python