拆分字符串并将语言环境应用于 Pandas 系列的每一行
Split string and apply locale to every row of Pandas Series
我想对以下 df 的 amount
列进行两次转换:
Address type amount
0 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250,000 VSO
1 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250,000 VSO
2 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250,000 VSO
- 我想从所有行中删除“VSO”子字符串。
- 我想将
locale.setlocale(locale.LC_ALL, 'en_us')
应用于每一行,将每个字符串转换为遵循该格式的浮点数。
我目前的密码是:
locale.setlocale(locale.LC_ALL, 'en_us')
df_test['amount'].str.split(' VSO')[0]
locale.atof((str(df_test['amount'].values)))
这让我产生了错误:
ValueError: could not convert string to float: "['250000 VSO' '250000 VSO' '250000 VSO' '33333 VSO' '33333 VSO'\n '10400000 VSO' '170833 VSO' '170833 VSO' '170833 VSO' '170833 VSO'\n
在使用 rstrip
删除尾随的“VSO”后尝试使用 apply
:
import locale
locale.setlocale(locale.LC_ALL, 'en_us')
df["amount"] = df["amount"].str.rstrip(" VSO").apply(locale.atof)
>>> df
Address type amount
0 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
1 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
2 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
我认为@not_speshal 完美地回答了这个问题。
在字符串稍微变化的情况下(例如 VSO
发生变化),我们可以使用以下 regex
:
>>> df['amount'] = df.amount.str.extract(r"(\d+\,\d+|\d+)")[0].str.replace(',', '').astype(float)
>>> df
Address type amount
0 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
1 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
2 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
我想对以下 df 的 amount
列进行两次转换:
Address type amount
0 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250,000 VSO
1 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250,000 VSO
2 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250,000 VSO
- 我想从所有行中删除“VSO”子字符串。
- 我想将
locale.setlocale(locale.LC_ALL, 'en_us')
应用于每一行,将每个字符串转换为遵循该格式的浮点数。
我目前的密码是:
locale.setlocale(locale.LC_ALL, 'en_us')
df_test['amount'].str.split(' VSO')[0]
locale.atof((str(df_test['amount'].values)))
这让我产生了错误:
ValueError: could not convert string to float: "['250000 VSO' '250000 VSO' '250000 VSO' '33333 VSO' '33333 VSO'\n '10400000 VSO' '170833 VSO' '170833 VSO' '170833 VSO' '170833 VSO'\n
在使用 rstrip
删除尾随的“VSO”后尝试使用 apply
:
import locale
locale.setlocale(locale.LC_ALL, 'en_us')
df["amount"] = df["amount"].str.rstrip(" VSO").apply(locale.atof)
>>> df
Address type amount
0 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
1 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
2 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
我认为@not_speshal 完美地回答了这个问题。
在字符串稍微变化的情况下(例如 VSO
发生变化),我们可以使用以下 regex
:
>>> df['amount'] = df.amount.str.extract(r"(\d+\,\d+|\d+)")[0].str.replace(',', '').astype(float)
>>> df
Address type amount
0 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
1 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0
2 0x88aDa02f6fCE2F1A833cd9B4999D62a7ebb70367 outflow 250000.0