Отображать минимальное значение, исключая ноль, вместе со значением в соседнем столбце каждого года + Python 3+, датафрейм - PullRequest
0 голосов
/ 12 декабря 2018

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

Данные:

Year  Product       Price
2000   Grapes       0
2000   Apple        220
2000   pear         185
2000   Watermelon   172
2001   Orange       0 
2001   Muskmelon    90
2001   Pear         165
2001   Watermelon   99

Желательный вывод в новом кадре данных:

Year  Minimum Price  Product
2000  172            Watermelon  
2001  90             Muskmelon   

1 Ответ

0 голосов
/ 12 декабря 2018

Сначала отфильтруйте 0 строк по boolean indexing:

df1 = df[df['Price'] != 0]

А затем используйте DataFrameGroupBy.idxmin для индексов для минимального Price нагруппы с выбором по loc:

df2 = df1.loc[df1.groupby('Year')['Price'].idxmin()]

В качестве альтернативы можно использовать sort_values с drop_duplicates:

df2 = df1.sort_values(['Year', 'Price']).drop_duplicates('Year')

print (df2)
   Year     Product  Price
3  2000  Watermelon    172
5  2001   Muskmelon     90

Если возможно несколько минимальных значений и нужно их все по группам:

print (df)
   Year     Product  Price
0  2000      Grapes      0
1  2000       Apple    220
2  2000        pear    172
3  2000  Watermelon    172
4  2001      Orange      0
5  2001   Muskmelon     90
6  2001        Pear    165
7  2001  Watermelon     99

df1 = df[df['Price'] != 0]
df = df1[df1['Price'].eq(df1.groupby('Year')['Price'].transform('min'))]
print (df)
   Year     Product  Price
2  2000        pear    172
3  2000  Watermelon    172
5  2001   Muskmelon     90

РЕДАКТИРОВАТЬ:

print (df)
   Year     Product  Price
0  2000      Grapes      0
1  2000       Apple    220
2  2000        pear    185
3  2000  Watermelon    172
4  2001      Orange      0
5  2001   Muskmelon     90
6  2002        Pear      0
7  2002  Watermelon      0

df['Price'] = df['Price'].replace(0, np.nan)
df2 = df.sort_values(['Year', 'Price']).drop_duplicates('Year')
df2['Product'] = df2['Product'].mask(df2['Price'].isnull(), 'No data')
print (df2)
   Year     Product  Price
3  2000  Watermelon  172.0
5  2001   Muskmelon   90.0
6  2002     No data    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...