чтобы мне достать из этих столбцов уникальные значенияВот это не совсем понятно, может имелось ввиду из списков, уникальные, и что значит достать.
(
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')
)
...
)
apply
он применяется к каждой строке или каждой колонке параметр axis
, то есть когда ты пишешь свою кастомную функцию на вход она будет получать либо numpy массив либо pandas Series. Вообще apply
для фрейма имеет довольно много интересных параметров почитай доки этого метода он реально мощный. pipe(func, *args, **kwargs)
и тебе приходит копия оригинального фрейма с твоими изменениями описанными в func
, это очень хорошая практика. Номер Телефона,Имя,Фамилия
333,Иван,Петров
333,Василий,Сидоров
444,Петр,Прямой
333,Федор,Кривой
import pandas as pd
phone_numbers = pd.read_csv('test.csv',index_col='Номер Телефона')
numbers_of_interset = [777,333]
index = phone_numbers.index.intersection(numbers_of_interset)
not_found = pd.Index(numbers_of_interset).difference(phone_numbers.index)
(
phone_numbers.loc[index,:]
.to_csv('result.csv')
)
print(phone_numbers.loc[index,:].shape[0])
Даст тебе количество.