преобразование таблицы за год и месяц в серию pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть несколько файлов, которые выглядят следующим образом.

 Year    Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1997    1.840%  -0.680% 0.480%  1.550%  1.510%  1.750%  2.630%  -0.190% 2.960%  2.180%  0.610%  0.710%
1998    -0.470% 1.270%  2.130%  1.200%  0.880%  1.790%  -0.800% -1.000% 1.080%  0.480%  0.710%  2.930%
  

Есть ли какой-либо способ чистого преобразования файлов, подобных этому, в серию pandas?

Ответ №1:

Я не уверен, включает ли ваш вопрос синтаксический анализ файлов или нет, так что вот оно:

Сначала мы проанализируем файл (csv), убедившись, что он разделен пробелами:

 df = pd.read_csv('data.csv', delim_whitespace=True)
  

delim_whitespace лучше, чем sep = » «, потому что он интерпретирует любое количество последовательных пробелов как один разделитель.

Затем мы melt используем фрейм данных для объединения строк и столбцов вместе (т. е. столбец ‘Jan’ и строка ‘1997’ становятся одной строкой ‘Jan 1997’ с правильным процентным значением).

  df = pd.melt(df, id_vars=["Year"], var_name="Month", value_name = "Percentage")
  

Теперь мы делаем некоторую очистку: объединяем столбцы ‘Month’ и ‘Year’ вместе, удаляем столбец ‘Year’, разбираем строки как datetime и сортируем по дате.

 df['Month'] = df.Month   " "   df.Year.map(str)
df = df.drop('Year', axis=1)
df["Month"] = pd.to_datetime(df.Month, format="%b %Y", dayfirst=True)
df = df.sort("Month")
df = df.set_index("Month")
  

Наконец, мы можем преобразовать наш фрейм данных в серию:

 series = df.ix[:,0]
  

Конечный результат дает нам следующую серию:

 Month
1997-01-01     1.840%
1997-02-01    -0.680%
1997-03-01     0.480%
...
1998-10-01     0.480%
1998-11-01     0.710%
1998-12-01     2.930%
Name: Percentage, dtype: object
  

Надеюсь, это поможет!

Ответ №2:

в настоящее время мое решение таково, но оно кажется довольно нестандартным.

 df = pd.read_excel("file.xls")
df = df.set_index("year")
frame = df.stack()
new_index = []
for item in frame.index:
    ts = pd.Timestamp(item[1]  "-1-"  str(int(item[0])))
    new_index.append(ts)
frame.index = new_index