2015-06-19 4 views
1

В настоящее время у меня есть dataframe следующим образом, и все, что я хочу сделать, это просто заменить строки в Maturity с помощью только числа внутри них. Например, я хочу заменить FZCY0D на 0 и так далее.Замена строк в столбце Dataframe с номером в строке

  Date Maturity Yield_pct Currency 
0  2009-01-02  FZCY0D  4.25  AUS 
1  2009-01-05  FZCY0D  4.25  AUS 
2  2009-01-06  FZCY0D  4.25  AUS 

Мой код выглядит следующим образом, и я попытался заменить эти строки с числами, но это приводит к ошибке AttributeError: 'Series' object has no attribute 'split' в строке result.Maturity.replace(result['Maturity'], [int(s) for s in result['Maturity'].split() if s.isdigit()]). Поэтому я стараюсь понять, как это сделать.

from pandas.io.excel import read_excel 
import pandas as pd 
import numpy as np 
import xlrd 

url = 'http://www.rba.gov.au/statistics/tables/xls/f17hist.xls' 
xls = pd.ExcelFile(url) 

#Gets rid of the information that I dont need in my dataframe 
df = xls.parse('Yields', skiprows=10, index_col=None, na_values=['NA']) 


df.rename(columns={'Series ID': 'Date'}, inplace=True) 

# This line assumes you want datetime, ignore if you don't 
#combined_data['Date'] = pd.to_datetime(combined_data['Date']) 

result = pd.melt(df, id_vars=['Date']) 

result['Currency'] = 'AUS' 
result.rename(columns={'value': 'Yield_pct'}, inplace=True) 
result.rename(columns={'variable': 'Maturity'}, inplace=True) 

result.Maturity.replace(result['Maturity'], [int(s) for s in result['Maturity'].split() if s.isdigit()]) 


print result 
+0

Параметр 'раздвоение() 'для отдельной строки; он возвращает список строк, разбитых пробелом. – chrisaycock

ответ

2

Вы можете использовать vectorised str методы и передать регулярное выражение для извлечения номера:

In [15]: 

df['Maturity'] = df['Maturity'].str.extract('(\d+)') 
df 
Out[15]: 
     Date Maturity Yield_pct Currency 
0 2009-01-02  0  4.25  AUS 
1 2009-01-05  0  4.25  AUS 
2 2009-01-06  0  4.25  AUS 

Вы можете назвать astype(int) бросить серию в целом:

In [17]: 
df['Maturity'] = df['Maturity'].str.extract('(\d+)').astype(int) 
df.info() 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 3 entries, 0 to 2 
Data columns (total 4 columns): 
Date   3 non-null object 
Maturity  3 non-null int32 
Yield_pct 3 non-null float64 
Currency  3 non-null object 
dtypes: float64(1), int32(1), object(2) 
memory usage: 108.0+ bytes 
Смежные вопросы