Фрейм данных Pandas, найдите максимальное значение и верните значение соседнего столбца, а не всю строку - PullRequest
0 голосов
/ 06 сентября 2018

Новичок в Пандах, так что извините, если есть очевидное решение ... Я импортировал CSV, который имел только 2 столбца, и я создал 3-й столбец. Вот скриншот из 10 лучших строк и заголовка: Снимок экрана DataFrame

Я выяснил, как найти минимальное и максимальное значения в столбце ['Amount Changed'], но мне также нужно извлечь дату, связанную с минимальным и максимальным значениями, но не с индексом и ['Прибыль / убыток' ]. Я попробовал iloc, loc, прочитал о groupby - я не могу заставить ни одного из них вернуть одно значение (в данном случае дату), которое я могу использовать снова.

Моя цель - создать новую переменную Gi_Date, которая находится в той же строке, что и максимальное значение в ['Amount Changed'], но привязана к дате в столбце ['Date'].

Я пытаюсь разделить переменные, чтобы использовать их в операторах печати, записывать их в текстовые файлы и т. Д.

import os
import csv
import pandas as pd
import numpy as np

#path for CSV file
csvpath = ("budget_data.csv")
#Read CSV into Panadas and give it a variable name Bank_pd
Bank_pd = pd.read_csv(csvpath, parse_dates=True)

#Number of month records in the CSV
Months = Bank_pd["Date"].count()

#Total amount of money captured in the data converted to currency
Total_Funds = '${:.0f}'.format(Bank_pd["Profit/Losses"].sum())

#Determine the amount of increase or decrease from the previous month
AmtChange = Bank_pd["Profit/Losses"].diff()
Bank_pd["Amount Changed"] = AmtChange

#Identify the greatest positive change
GreatestIncrease = '${:.0f}'.format(Bank_pd["Amount Changed"].max())
Gi_Date = Bank_pd[Bank_pd["Date"] == GreatestIncrease]

#Identify the greatest negative change
GreatestDecrease =  '${:.0f}'.format(Bank_pd["Amount Changed"].min())
Gd_Date = Bank_pd[Bank_pd['Date'] == GreatestDecrease]

print(f"Total Months: {Months}")
print(f"Total: {Total_Funds}")
print(f"Greatest Increase in Profits: {Gi_Date}  ({GreatestIncrease})")
print(f"Greatest Decrease in Profits: {Gd_Date} ({GreatestDecrease})")

Когда я запускаю скрипт в git bash, я больше не получаю сообщение об ошибке, поэтому думаю, что приближаюсь, а не показываю дату, на которой написано:

$ python PyBank.py
Total Months: 86
Total: $38382578
Greatest Increase in Profits: Empty DataFrame
Columns: [Date, Profit/Losses, Amount Changed]
Index: []  ($1926159)
Greatest Decrease in Profits: Empty DataFrame
Columns: [Date, Profit/Losses, Amount Changed]
Index: [] ($-2196167)

Я хочу напечатать так:

$ python PyBank.py
Total Months: 86
Total: $38382578
Greatest Increase in Profits: Feb-2012  ($1926159)
Greatest Decrease in Profits: Sept-2013 ($-2196167)

Вот годичная датафрейм на один год:

bank_pd = pd.DataFrame({'Date':['Jan-10', 'Feb-10', 'Mar-10', 'Apl-10', 'May-10', 'Jun-10', 'Jul-10', 'Aug-10', 'Sep-10', 'Oct-10', 'Nov-10', 'Dec-10'],
                        'Profit/Losses':[867884, 984655, 322013, -69417, 310503, 522857, 1033096, 604885, -216386, 477532, 893810, -80353]})

Ожидаемый результат с примером df будет: Всего месяцев: 12 Всего фондов: $ 5651079 Наибольшее увеличение прибыли: 10 октября ($ 693918) Наибольшее снижение прибыли: 10 декабря ($ -974163)

У меня также была ошибка в приведенном выше примере кадра данных, мне не хватало месяца, когда я его быстро набрал - сейчас это исправлено.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

В вашем примере кода Gi_date и Gd_date пытаются инициализировать новые DF вместо вызова значений.Измените Gi_Date и Gd_Date:

Gi_Date = Bank_pd.sort_values('Profit/Losses').tail(1).Date
Gd_Date = Bank_pd.sort_values('Profit/Losses').head(1).Date

Проверьте выходные данные:

Gi_Date
Jul-10
Gd_Date
Sep-10

Чтобы напечатать, как вы хотите печатать, используя форматирование строки:

print("Total Months: %s" %(Months))
print("Total: %s" %(Total_Funds))
print("Greatest Increase in Profits: %s %s" %(Gi_Date.to_string(index=False), GreatestIncrease))
print("Greatest Decrease in Profits: %s %s" %(Gd_Date.to_string(index=False), GreatestDecrease))

Обратите внимание, если вы неНе используйте:

(Gd_Date.to_string(index=False)

Информация об объекте pandas будет включена в вывод на печать, как это происходит в вашем примере, когда вы видите информацию о DataFrame.Выход за 12 месяцев выборки DF:

Total Months: 12
Total: $5651079
Greatest Increase in Profits: Jul-10 $693918
Greatest Decrease in Profits: Sep-10 $-974163
0 голосов
/ 06 сентября 2018

Используйте Series.idxmin и Series.idxmax с loc:

df.loc[df['Amount Changed'].idxmin(), 'Date']
df.loc[df['Amount Changed'].idxmax(), 'Date']

Полный пример на основе вашего образца DataFrame:

df = pd.DataFrame({'Date':['Jan-2010', 'Feb-2010', 'Mar-2010', 'Apr-2010', 'May-2010',
                           'Jun-2010', 'Jul-2010', 'Aug-2010', 'Sep-2010', 'Oct-2010'],
                   'Profit/Losses': [867884,984655,322013,-69417,310503,522857,
                                     1033096,604885,-216386,477532]})
df['Amount Changed'] = df['Profit/Losses'].diff()

print(df)

       Date  Profit/Losses  Amount Changed
0  Jan-2010         867884             NaN
1  Feb-2010         984655        116771.0
2  Mar-2010         322013       -662642.0
3  Apr-2010         -69417       -391430.0
4  May-2010         310503        379920.0
5  Jun-2010         522857        212354.0
6  Jul-2010        1033096        510239.0
7  Aug-2010         604885       -428211.0
8  Sep-2010        -216386       -821271.0
9  Oct-2010         477532        693918.0

print(df.loc[df['Amount Changed'].idxmin(), 'Date'])
print(df.loc[df['Amount Changed'].idxmax(), 'Date'])

Sep-2010
Oct-2010
0 голосов
/ 06 сентября 2018

Я вижу несколько глюков в используемых переменных.

Bank_pd["Amount Changed"] = AmtChange

Вышеприведенный оператор фактически заменяет фрейм данных столбцом «Сумма изменена». После этого утверждения вы можете использовать этот столбец для любых манипуляций.

Ниже приведен обновленный код и выделены вновь добавленные строки. Вы можете добавить дальнейшее форматирование:

import pandas as pd


csvpath = ("budget_data.csv")

Bank_pd = pd.read_csv(csvpath, parse_dates=True)
inp_bank_pd = pd.DataFrame(Bank_pd)

Months = Bank_pd["Date"].count()
Total_Funds = '${:.0f}'.format(Bank_pd["Profit/Losses"].sum())

AmtChange = Bank_pd["Profit/Losses"].diff()
GreatestIncrease = Bank_pd["Amount Changed"].max()

Gi_Date = inp_bank_pd.loc[Bank_pd["Amount Changed"] == GreatestIncrease]

print(Months)
print(Total_Funds)
print(Gi_Date['Date'].values[0])
print(GreatestIncrease)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...