df = pd.DataFrame({
'A':[np.random.randint(1,100,20) for i in range(5)],
})
result = (
df.assign(
three_largest = lambda x: x['A'].apply(lambda x: pd.Series(x).nlargest(3).tolist()),
three_largest_index = lambda x: x['A'].apply(lambda x: pd.Series(x).nlargest(3).index.tolist())
)
)
result[['one','two','three']] = pd.DataFrame(result['three_largest_index'].tolist(),index=result.index)
result
Как видишь все в разных вариациях, как удобно. df = pd.DataFrame({
'A':[[5,6,24,3],[23,11,15],[3,100]],
'B':np.NaN
})
(
df.assign(
A_max =lambda x: x['A'].apply(max),
B_indexmax =lambda x: x['A'].apply(lambda x: pd.Series(x).idxmax()),
)
)
чтобы мне достать из этих столбцов уникальные значенияВот это не совсем понятно, может имелось ввиду из списков, уникальные, и что значит достать.
(
pd.DataFrame({
'ID':[1,2],
'genres':[['Strategy'],['Fightening','Adventure','Arcade']]
})
.explode('genres')
)
Затем unique (уникальные) value_counts (посчитать каких и сколько у тебя там) или все что угодно, опций огромное количество. Обрати внимание структура фрейма не рушится (поведение колонки ID).OpenAI(api_key="Your API Key")
class A:
def __init__(self,*, key=None):
self.key = key
a = A('12345')
from collections import namedtuple
Point = namedtuple("Point", ['x','y'])
point = Point(2,4)
print(point)
d = {
'x':2,
'y':4
}
print(namedtuple('Point',d.keys())(*d.values()))
a = 1
b = 2
c = 3
def func():
print(a,b,c)
if __name__ == "__main__":
func()
Работает, как ожидается, а теперь маленькое изменениеa = 1
b = 2
c = 3
def func():
print(a,b,c)
c = 100
print(c)
if __name__ == "__main__":
func()
И все ошибка даже print(a,b,c) не выполнится. Потому что с находится в локальной области видимости функции python ее находит и также он находит ее упоминание (print(a,b,c)) до ее определения. def func():
global c
print(a,b,c)
c = 100
print(c)
if __name__ == "__main__":
func()
a = [0]
b = [0]
c = [0]
def func():
print(a,b,c)
c.append(100)
print(c)
if __name__ == "__main__":
func()
def func():
total = 0
def inner():
nonlocal total
total +=1
return total
return inner
if __name__ == "__main__":
add = func()
print(add())
print(add())
print(add())
Если убрать ключевое слово nonlocal то мы получим ошибку. (
df
.assign(
groups=(df['EventType'] != df['EventType'].shift())
.cumsum()
)
.groupby('groups'
)
.agg(
first= pd.NamedAgg(column='EventTime',aggfunc=lambda x: np.min(x)),
last= pd.NamedAgg(column='EventTime',aggfunc=lambda x: np.max(x)),
EventType= pd.NamedAgg(column='EventType',aggfunc=lambda x: set(x).pop()),
user_id=pd.NamedAgg(column='user_id',aggfunc=lambda x: set(x).pop()),
)
.reset_index(drop=True)
.loc[:,['user_id','EventType','first','last']]
)
(
df
.groupby(
(df["EventType"] != df["EventType"].shift())
.cumsum()
)
.agg({"EventTime" : ["min", "max"]})
)
Остальное это манипуляции для идентичного твоему вывода (писал на скорую руку совместил агрегации с трансформациями) что не есть хорошо, я бы поработал и сделал лучше. В целом сработает и для строк, но лучше привести EventTime к типу данных datetime64[ns]. Сделать это можно (
df.assign(
EventTime=lambda x: pd.to_datetime(x['EventTime'],format='%Y-%m-%d %H:%M:%S')
)
...
)