Попробуйте .to_datetime
и метод доступа dt
:
import pandas as pd
data = pd.DataFrame({'year': [2018, 2018, 2018], 'month': [12, 12, 12], 'day': [1, 2, 3]})
data['weekday'] = pd.to_datetime(data[['year', 'month', 'day']]).dt.weekday
print(data)
Даю:
year month day weekday
0 2018 12 1 5
1 2018 12 2 6
2 2018 12 3 0
Обратите внимание, что день недели индексируется нулем.
Можно получить список весь элементы соответствия с пониманием списка:
[x for x in myList if x.n == 30] # list of all elements with .n==30
, Если Вы просто хотите определить, содержит ли список какой-либо элемент, который соответствует и делает это (относительно) эффективно, можно сделать
def contains(list, filter):
for x in list:
if filter(x):
return True
return False
if contains(myList, lambda x: x.n == 3) # True if any element has .n==3
# do stuff
Простой, Изящный, и Мощный:
выражение генератора А в conjuction с builtin†¦ (python 2.5 +)
any(x for x in mylist if x.n == 10)
Использование встроенный Python any()
, который определяется следующим образом:
любой (повторяемый)
->
Возвращают True, если какой-либо элемент повторяемого верен. Эквивалентный:
def any(iterable):
for element in iterable:
if element:
return True
return False
Только для полноты, давайте не забывать Самую Простую Вещь, Которая Могла Возможно Работать:
for i in list:
if i.n == 5:
# do something with it
print "YAY! Found one!"
[x for x in myList if x.n == 30] # list of all matches
[x.n_squared for x in myList if x.n == 30] # property of matches
any(x.n == 30 for x in myList) # if there is any matches
[i for i,x in enumerate(myList) if x.n == 30] # indices of all matches
def first(iterable, default=None):
for item in iterable:
return item
return default
first(x for x in myList if x.n == 30) # the first match, if any
Можно использовать in
для поиска объекта в наборе и понимания списка для извлечения поля, которым Вы интересуетесь. Это (работает на списки, наборы, кортежи и что-либо, что определяет __contains__
или __getitem__
).
if 5 in [data.n for data in myList]:
print "Found it"
См. также:
Необходимо добавить __eq__
и __hash__
метод к Вашему Data
класс, он мог проверить, равны ли __dict__
атрибуты (те же свойства) и затем если их значения равны, также.
, Если Вы сделали это, можно использовать
test = Data()
test.n = 5
found = test in myList
in
проверки ключевого слова, если test
находится в myList
.
, Если Вы только хотите к n
свойство в [1 110], Вы могли бы использовать:
class Data(object):
__slots__ = ['n']
def __init__(self, n):
self.n = n
def __eq__(self, other):
if not isinstance(other, Data):
return False
if self.n != other.n:
return False
return True
def __hash__(self):
return self.n
myList = [ Data(1), Data(2), Data(3) ]
Data(2) in myList #==> True
Data(5) in myList #==> False
Рассмотрите использование словаря:
myDict = {}
for i in range(20):
myDict[i] = i * i
print(5 in myDict)