Функциональные столбцы Python

Я борюсь с чем-то, вероятно, простым в python/pandas...

У меня есть dataFrame с датами в столбцах, именами фруктов в индексе и ценами внутри.

Я ищу функцию, которая при вводе даты дает мне цены на фрукты на эту дату.

[in]  mylist
[out]

             2017-03-23 2017-03-22 2017-03-21 2017-03-20 2017-03-17 2017-03-16 

pear            12       13        14        12        20      17   
apple           14        9        11        21        12      4   
banana         120       180       140       170       605     802  
etc...         NaN       NaN       NaN       NaN       NaN     NaN   


ex. [in] myPrice('2017-03-23')
[out]   2017-03-23
pear       12
apple      14 
banana     120

Большое спасибо!

Изменить: моя цель - ввести дату, и она возвращает мне соответствующий столбец, поэтому date = '2017-03-23' myPrice(date) возвращает соответствующий.

поэтому я не пытаюсь сделать это с помощью mylist[2017-03-23], а с кем-то, кто должен быть mylist[date]


person user6457870    schedule 05.04.2017    source источник


Ответы (2)


Я думаю, вам нужно, если столбцы являются строками:

mylist['2017-03-23']
mylist.loc[:, '2017-03-23']

Если столбцы являются датой и временем, тогда нужно datetime:

#If columns not datetime, convert them
mylist.columns = pd.to_datetime(mylist.columns)

#convert string to datetime
date = pd.to_datetime('2017-03-23')
#another solution
#date = pd.Timestamp('2017-03-23')

print (mylist[date])
pear       12
apple      14
banana    120
Name: 2017-03-23 00:00:00, dtype: int64

print (mylist.loc[:, date])
pear       12
apple      14
banana    120
Name: 2017-03-23 00:00:00, dtype: int64

И для одного столбца DataFrame добавляем []:

print (mylist[[date]])
        2017-03-23
pear            12
apple           14
banana         120

print (mylist.loc[:, [date]])
        2017-03-23
pear            12
apple           14
banana         120

Также работает (но я получаю предупреждение):

VisibleDeprecationWarning: преобразование массива с ndim > 0 в индекс приведет к ошибке в будущем блоке = self.blocks[self._blknos[i]]

date ='2017-03-23'
print (mylist[date])
person jezrael    schedule 05.04.2017
comment
Спасибо за ответ, но я хочу его, введя дату в функцию. Как Myprice(date) date = '2017-03-23' Затем верните соответствующий столбец - person user6457870; 05.04.2017
comment
затем просто определите myPrice = lambda date: mylist.loc[:, date] - person Quickbeam2k1; 05.04.2017
comment
Он возвращает ‹function main.‹lambda›› - person user6457870; 05.04.2017
comment
какой возврат печати (df.columns)? - person jezrael; 05.04.2017
comment
DatetimeIndex([с моими разными датами внутри - person user6457870; 05.04.2017
comment
Так что date = pd.to_datetime('2017-03-23') print (mylist[date]) или print (mylist.loc[:, date]) могут отлично работать - person jezrael; 05.04.2017
comment
Это было много работы. Вы заслуживаете больше голосов :-) - person piRSquared; 05.04.2017
comment
@user6457870 user6457870 - значит ключ не datetime ? - person jezrael; 05.04.2017
comment
Нет, на самом деле оба ваших ответа были правильными, у меня были небольшие проблемы с набором данных... Как новичок, некоторые простые вещи кажутся сложными, когда вы никогда этого не делали... - person user6457870; 05.04.2017
comment
Чтобы закончить, я пытаюсь сделать что-то еще, мне было интересно, есть ли ярлык для этого. Я хочу найти процентиль каждой из этих цен относительно всех цен на дату. Я знаю, как это сделать математически, но я не могу найти ничего, чтобы сделать это быстро... есть идеи? Еще раз спасибо! - person user6457870; 05.04.2017
comment
Кажется, вам нужно print (mylist.quantile()), также проверьте quantile. Если нужно что-то еще, лучше всего создать новый вопрос с примерами данных, желаемым результатом и тем, что вы пытаетесь. - person jezrael; 05.04.2017

pandas позволяет вам получить доступ к столбцам через имя столбца с помощью селектора []

mylist['2017-03-23']

Однако, чтобы быть более явным, вы можете использовать .loc[]

mylist.loc[:, '2017-03-23']

Или даже используйте метод xs:

mylist.xs('2017-03-23', axis=1)

Любой из них может быть обернут в функцию:

def myPrice(date):
    return mylist[date]
person piRSquared    schedule 05.04.2017
comment
Спасибо за ваш комментарий, к сожалению, когда я это делаю, он возвращает TypeError: только целочисленные массивы с одним элементом могут быть преобразованы в индекс - person user6457870; 05.04.2017
comment
@user6457870 user6457870 извините, была опечатка. У меня было data вместо date в функции. Попробуйте еще раз - person piRSquared; 05.04.2017