6

私の問題には迅速な解決策が必要だと感じています。複数のリスト内包表記を使用して、実装が不十分なソリューションをハックしましたが、これはまったく理想的ではありません。誰かがここで助けてくれるかもしれません。

文字列 (3.2B、1.5M、1.1T など) の値のセットがあり、当然最後の文字は百万、十億、兆を表します。セット内には、そのままにしておかなければならない NaN/'none' 値もあります。これらを float または int に変換したいので、指定された例では (3200000000, 1500000, 1100000000000)

ティア

4

3 に答える 3

6

関数を作成できます:applymapデータフレーム内のすべてのエントリに:

powers = {'B': 10 ** 9, 'M': 10 ** 6, 'T': 10 ** 12}
# add some more to powers as necessary

def f(s):
    try:
        power = s[-1]
        return int(s[:-1]) * powers[power]
    except TypeError:
        return s

df.applymap(f)
于 2013-01-08T15:55:00.950 に答える
3

@MaxU の借り入れを設定する
pd.DataFrame

df = pd.DataFrame({'col': ['123.456', '78M', '0.5B']})

解決策
文字列を科学表記法に置き換えてから使用しますastype(float)

d = dict(M='E6', B='E9', T='E12')

df.replace(d, regex=True).astype(float)

            col
0  1.234560e+02
1  7.800000e+07
2  5.000000e+08
于 2017-10-04T22:37:08.783 に答える
2

デモ:

In [58]: df
Out[58]:
       col
0  123.456
1      78M
2     0.5B

In [59]: d = {'B': 10**9, 'M': 10**6}

In [60]: df['new'] = \
    ...: df['col'].str.extract(r'(?P<val>[\d.]+)\s*?(?P<mult>\D*)', expand=True) \
    ...:   .replace('','1') \
    ...:   .replace(d, regex=True) \
    ...:   .astype(float) \
    ...:   .eval('val * mult')
    ...:

In [61]: df
Out[61]:
       col           new
0  123.456  1.234560e+02
1      78M  7.800000e+07
2     0.5B  5.000000e+08
于 2017-10-04T22:25:58.020 に答える