Как построить индексный столбец в pandas / matplotlib? - PullRequest
0 голосов
/ 02 апреля 2020

В качестве значимого индекса у меня есть первый столбец моего фрейма данных. Я, чтобы построить этот столбец в качестве моей оси X. Тем не менее, я изо всех сил пытаюсь сделать это, поскольку я продолжаю получать сообщение об ошибке:

"Ни один из [Float64Index ([1992.9595, 1992.9866, 1993.0138, 1993.0409, 1993.0681, 1993.0952, \ n 1993.1223, 1993.1495, 1993.17.1766 , 1993.2038, \ n ... \ n 2002.7328, 2002.7599, 2002.7871, 2002.8142, 2002.8414, 2002.8685, \ n 2002.8957, 2002.9228, 2002.95, 2002.9771], \ n dtype = 'float64', name = 'Time', length = 340 )] находятся в [колонках] "

Я пытался использовать x=df_topex.index, как предложено в другом вопросе на форуме (ссылка ниже), но это, похоже, не работает для меня. Мне было интересно, может ли кто-нибудь объяснить мне, почему и как я могу добиться построения.

df_topex = pd.read_csv('datasets/TOPEX.dat', 
                       sep='\s+', #multiple spaces as separator
                       index_col=0, #convert first column to index
                       names=["Time", "Anomaly"], #naming the headers
                      )

df_topex.plot(kind='scatter', x=df_topex.index, y='Anomaly', color='red')
plt.show()

Другой вопрос: Используйте индекс в pandas для построения данных

1 Ответ

2 голосов
/ 02 апреля 2020

Я изменяю свой ответ на ваш отзыв, воспроизводя более точную проблему.

С этим:

df_topex = pd.read_csv('datasets/TOPEX.dat', 
                       sep='\s+', #multiple spaces as separator
                       index_col=0, #convert first column to index
                       names=["Time", "Anomaly"], #naming the headers
                      )

У вас есть что-то вроде этого, где столбец "Время" является index:

    Time    Anomaly
---------  ---------
1992.9595     2.0000
1992.9866     3.0000
1993.0138     4.0000
1993.0409     5.0000
1993.0681     6.0000
1993.0952     7.0000

Чтобы построить это, мы можем сделать следующее, как вы говорите, но просто к вашему сведению, есть проблема с этим методом (https://github.com/pandas-dev/pandas/issues/16529, но пока не большой сделка):

df_topex.reset_index(inplace=True)
tabulate_df(df_topex)

Это может быть безопаснее:

df_topex = df_topex.reset_index()

В любом случае, у нас есть «Время» в качестве столбца, готового для использования на графике (я отмечаю, что «Время» кажется мне не хватает формата времени):

            Time    Anomaly
------  ---------  ---------
     0  1992.9595     2.0000
     1  1992.9866     3.0000
     2  1993.0138     4.0000
     3  1993.0409     5.0000
     4  1993.0681     6.0000
     5  1993.0952     7.0000

Чтобы построить это:

df_topex.plot(kind='scatter', x='Time', y='Anomaly', color='red')

Тогда давайте подумаем, следуя вашему последнему вопросу: хорошо ... У нас есть сюжет, но теперь мы не можем использовать преимущества использования «Time» в качестве индекса, не так ли?

Index оказывает существенное влияние на производительность при фильтрации миллионов строк. Может быть, вы заинтересованы в использовании столбца «Время» в качестве индекса, потому что у вас есть или предвидеть высокий объем. Можно построить миллионы точек (например, затенение данных), но это не очень распространено. Фильтрация любого DataFrame перед построением графика довольно распространена, и в этот момент индексирование столбца для фильтрации может действительно помочь, после этого обычно появляется график.

Таким образом, мы можем работать поэтапно с различными DataFrames или вообще делать следующее после операции импорта csv, то есть, сохраняя индекс, чтобы поиграть с ним и нанося на график столбец Time2 в любое время:

df_topex['Time2'] = df_topex.index

Таким образом, мы сохраняем «Время» в качестве индекса:

    Time    Anomaly      Time2
---------  ---------  ---------
1992.9595     2.0000  1992.9595
1992.9866     3.0000  1992.9866
1993.0138     4.0000  1993.0138
1993.0409     5.0000  1993.0409
1993.0681     6.0000  1993.0681
1993.0952     7.0000  1993.0952

Как воспользоваться индексированием? Хороший пост, в котором оценивается производительность при фильтрации по индексу: Какое влияние на производительность оказывают неуникальные индексы в pandas?

Короче говоря, вам интересно иметь уникальный индекс или, по крайней мере, отсортированный.

# Performance preference in index type to filtering tasks: 
# 1) unique
# 2) if not unique, at least sorted (monotonic increase o decrease)
# 3) Worst combination: non-unique and unsorted.

# Let's check:
print ("Is unique?", df_topex.index.is_unique)
print ("Is is_monotonic increasing?", df_topex.index.is_monotonic_increasing)
print ("Is is_monotonic decreasing?", df_topex.index.is_monotonic_decreasing)

Из данных примера:

Is unique? True
Is is_monotonic increasing? True
Is is_monotonic decreasing? False

Если не отсортировано, вы можете выполнить задачу заказа по:

df_topex = df_topex.sort_index()
# Ready to go on filtering...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...