Как построить график Matplotlib, который принимает значения из разных столбцов - PullRequest
0 голосов
/ 14 апреля 2020

Это мой фрейм данных

        Order  Time  Profit
0       1   106     NaN
1       1   111  -296.0
2       2    14     NaN
3       2    16  -296.0
4       3    62     NaN
..    ...   ...     ...
335   106    32  -297.6
336   107    44     NaN
337   107    44   138.0
338   108    58     NaN
339   108    63  -303.4

Итак, я хочу, чтобы он работал, построив график, где X - время, Y - абсолютная цена (положительная или отрицательная), поэтому нам нужно иметь 2 бары. Теперь время должно быть не из той же строки, а из первой строки с тем же номером заказа.
Например, -296.0 будет под временем 106, а не 111, потому что 106 был первым по заказу №1. Как бы мы сделали что-то подобное?

Это мой код:

data = pd.read_csv(filename)
df = pd.DataFrame(data, columns = ['Order','Time','Profit']).astype(str)

#turns time column into hours of week
df['Time'] = df['Time'].apply(lambda x: findHourOfWeek(x))
df['Profit'] = df['Profit'].astype(float)

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Если вы предпочитаете полагаться на позицию в таблице данных, вы также можете сделать это:

plot_df = pd.DataFrame()
plot_df["Order"] = df.Order.unique()
plot_df["Profit"] = list(df.groupby("Order").nth(-1)["Profit"])
plot_df["Time"] = list(df.groupby("Order").nth(0)["Time"])

Однако, если вы хотите минимальное значение времени, вам лучше использовать решение, предоставленное Arne, так как оно будет более безопасным и правильным (при условии, что у вас есть только одно значение прибыли для каждого номера заказа).

0 голосов
/ 14 апреля 2020

Предполагая, что структура, которую мы видим в образце ваших данных, содержит весь набор данных, т. Е. Имеется только одно значение Profit на ордер, вы можете сделать это следующим образом: сгруппировать DataFrame по ордеру и агрегировать, взяв минимум :

df_grouped = df.groupby(by='Order').min()

, в результате чего получается этот фрейм данных:

       Time  Profit
Order       
1      106   -296.0
2       14   -296.0
3       62      NaN
...
106     32   -297.6
107     44    138.0
108     58  -303.4

Затем вы можете отсортировать по времени и построить график:

import matplotlib.pyplot as plt

df_grouped.sort_values(by='Time', inplace=True)
plt.plot(df_grouped['Time'], df_grouped['Profit'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...