Pandas значение суммы dataframe с символом доллара - PullRequest
2 голосов
/ 05 мая 2020

У меня есть pandas фрейм данных со столбцами ниже. Столбец_1 - это строка / текст, а не целое или десятичное число. Пара строк имеет строковое значение, а также имена (см. Строку № 6)

S.No.  Column_1
1      256
2      1
3      $300.54672
4      756
5      $292.34333
6      Andrew

Я хочу преобразовать все значения в column_1 в числа / int, кроме значений в долларах и строк с именами. Я требую, чтобы символ доллара был сохранен, но сумма должна быть округлена до 2 цифр после десятичной точки.

Ожидаемый результат:

S.No.  Column_1
1           256
2             1
3       $300.55
4           756
5       $292.34
6       Andrew

Я преобразовал весь столбец в numeri c с помощью pd .to_numeri c () с ошибками = 'coerce', но значения суммы стали пустыми (или) нулевыми, поскольку это была ошибка.

Любые предложения / помощь по этому поводу были бы очень признательны. Спасибо.

1 Ответ

3 голосов
/ 05 мая 2020

Фильтровать значения, начинающиеся с $ на Series.str.startswith, удалить $ на Series.str.strip, преобразовать в числа c, округлить, преобразовать в строки и добавить в начало $:

m = df['Column_1'].str.startswith('$', na=False)

s = '$' + df.loc[m, 'Column_1'].str.strip('$').astype(float).round(2).astype(str)

Или:

s = df.loc[m, 'Column_1'].str.strip('$').astype(float).round(2).astype(str).radd('$')

df.loc[m, 'Column_1'] = s


print (df)
   S.No. Column_1
0      1      256
1      2        1
2      3  $300.55
3      4      756
4      5  $292.34

Последнее, если необходимо, несопоставленные значения конвертируются в numeri c, но получают смешанные типы данных - строки с $ и числами без $:

df.loc[~m, 'Column_1'] = pd.to_numeric(df.loc[~m, 'Column_1'])
print (df)
   S.No.    Column_1
0      1         256
1      2           1
2      3  $300.54672
3      4         756
4      5  $292.34333

print (df['Column_1'].apply(type))
0    <class 'int'>
1    <class 'int'>
2    <class 'str'>
3    <class 'int'>
4    <class 'str'>
Name: Column_1, dtype: object

РЕДАКТИРОВАТЬ для последнего абзаца: Здесь можно добавить errors='coerce' для преобразования нечисловых c к отсутствующим значениям, а затем заменить их исходными:

df.loc[~m, 'Column_1'] = pd.to_numeric(df.loc[~m, 'Column_1'], errors='coerce').fillna(df['Column_1'])
print (df)
   S.No. Column_1
0      1      256
1      2        1
2      3  $300.55
3      4      756
4      5  $292.34
5      6   Andrew

print (df['Column_1'].apply(type))

0    <class 'float'>
1    <class 'float'>
2      <class 'str'>
3    <class 'float'>
4      <class 'str'>
5      <class 'str'>
Name: Column_1, dtype: object
...