Pandas: Как связать временные метки с данными кросс-таблицы - PullRequest
0 голосов
/ 12 марта 2020

У меня огромный массив данных с сотнями столбцов и сотнями тысяч строк. Я обрабатываю несколько столбцов, используя pd.crosstab и melt, чтобы получить данные в формате, который может быть легко нанесен на график. Фрейм данных df выглядит следующим образом:

Time    Speed    Height
1       100      200
2       150      220
3       500      270
4       500      270
5       900      245
6       150      269
7       100      220

Я просто подсчитываю количество экземпляров в каждой точке скорости и высоты и отображаю их на графике рассеяния. ;

new_df = pd.crosstab(df['Speed'], df['Height'].fillna('n/a'))

plot_df = new_df.reset_index() 
plot_df = plot_df.melt(id_vars="Speed")
plot_df = plot_df.rename(columns={"index": "Speed",
                                "variable": "Height",
                                "value": "Count"})

Я использую график, поэтому я могу использовать новый столбец Count в качестве размера маркера на графике, но я также использую его в hovertext для отображения значения счетчика вместе с X & Значения Y для этой точки. plot_df в конечном итоге выглядит как;

Speed    Height   Count
100        200        1
150        200        0
500        200        0
900        200        0
500        200        0
100        220        1
150        220        1
500        220        0
900        220        0
500        220        0
100        245        0
150        245        0
500        245        0
900        245        1
500        245        0
100        269        0
150        269        1
500        269        0
900        269        0
500        269        0
100        270        0
150        270        0
500        270        2
900        270        0
500        270        0

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

Как я могу это сделать? Вывод будет выглядеть примерно так:

Speed    Height   Count    Time/Index
100        200        1        1
150        200        0        0
500        200        0        0
900        200        0        0
500        200        0        0
100        220        1        7
150        220        1        2
500        220        0        0
900        220        0        0
500        220        0        0
100        245        0        0
150        245        0        0
500        245        0        0
900        245        1        5
500        245        0        0
100        269        0        0
150        269        1        6
500        269        0        0
900        269        0        0
500        269        0        0
100        270        0        0
150        270        0        0
500        270        2        3, 4
900        270        0        0
500        270        0        0

1 Ответ

1 голос
/ 12 марта 2020

Идея сначала агрегируется по GroupBy.agg с GroupBy.size и join, а затем добавляется 0 с melt альтернатива - DataFrame.unstack с DataFrame.stack:

new_df = (df.assign(Time = df['Time'].astype(str))
            .groupby(['Speed','Height'])['Time']
            .agg([('Count','size'),('Time', ', '.join)])
            .unstack(fill_value=0)
            .stack()
            .sort_index(level=[1,0])
            .reset_index())

print (new_df)
    Speed  Height  Count  Time
0     100     200      1     1
1     150     200      0     0
2     500     200      0     0
3     900     200      0     0
4     100     220      1     7
5     150     220      1     2
6     500     220      0     0
7     900     220      0     0
8     100     245      0     0
9     150     245      0     0
10    500     245      0     0
11    900     245      1     5
12    100     269      0     0
13    150     269      1     6
14    500     269      0     0
15    900     269      0     0
16    100     270      0     0
17    150     270      0     0
18    500     270      2  3, 4
19    900     270      0     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...