Python日常技巧2

reverse翻转数组

a = [1,0,5,4,8,9]

for i in range(0,(len(a)-1)//2):
    temp = a[i]
    a[i] = a[len(a)-i-1]
    a[len(a)-i-1] = temp
print(a)

每台机器的进程平均运行时间

数据准备

data = [[0, 0, 'start', 0.712], [0, 0, 'end', 1.52], [0, 1, 'start', 3.14], [0, 1, 'end', 4.12], [1, 0, 'start', 0.55], [1, 0, 'end', 1.55], [1, 1, 'start', 0.43], [1, 1, 'end', 1.42], [2, 0, 'start', 4.1], [2, 0, 'end', 4.512], [2, 1, 'start', 2.5], [2, 1, 'end', 5]]
activity = pd.DataFrame(data, columns=['machine_id', 'process_id', 'activity_type', 'timestamp']).astype({'machine_id':'Int64', 'process_id':'Int64', 'activity_type':'object', 'timestamp':'Float64'})

在这里插入图片描述
machine_id 是一台机器的ID号。
process_id 是运行在各机器上的进程ID号。
activity_type 是枚举类型 (‘start’, ‘end’)。
timestamp 是浮点类型,代表当前时间(以秒为单位)。
‘start’ 代表该进程在这台机器上的开始运行时间戳 , ‘end’ 代表该进程在这台机器上的终止运行时间戳。
现在需要计算每台机器各自完成一个进程任务的平均耗时。

import pandas as pd
def get_average_time(activity: pd.DataFrame) -> pd.DataFrame:
	#按照机器id和进程id进行分组,然后计算时间戳的差值
    activity['processing_time'] = activity.groupby(['machine_id','process_id'])['timestamp'].diff()
    #去掉空值
    activity = activity.dropna()
    return activity.groupby('machine_id',as_index=False)['processing_time'].mean().round(3)

pandas中agg的用法

查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额
数据准备:

import pandas as pd
data = [[121, 'US', 'approved', 1000, '2018-12-18'], [122, 'US', 'declined', 2000, '2018-12-19'], [123, 'US', 'approved', 2000, '2019-01-01'], [124, 'DE', 'approved', 2000, '2019-01-07']]
transactions = pd.DataFrame(data, columns=['id', 'country', 'state', 'amount', 'trans_date']).astype({'id':'Int64', 'country':'object', 'state':'object', 'amount':'Int64', 'trans_date':'datetime64[ns]'})

对DataFrame进行处理

#使用DataFrame自带的日期函数对日期进行格式化
transactions['month'] = transactions['trans_date'].dt.strftime('%Y-%m')
# 按城市和月份分组
df = transactions.groupby(['country','month']).agg(
	#agg函数中,指定的列可以理解成是DataFrame格式的
    trans_count=('id','count'),#指定id列,方法:计数
    approved_count = ('state',lambda x:(x=='approved').sum()),#对返回的True、False计数,True为1,False为0
    trans_total_amount = ('amount','sum'),
    #对amount进行过滤求和
    approved_total_amount = ('amount',lambda x:sum(x[transactions['state']=='approved']))
).reset_index()
print(df)
# print((transactions['state'] == 'approved'))

pandas:排序和重命名

数据准备:

import pandas as pd
from datetime import datetime
from collections import Counter
data = [[1, 100], [2, 200], [3, 300]]
employee = pd.DataFrame(data, columns=['id', 'salary']).astype({'id':'int64', 'salary':'int64'})

id:学生id
salary:学生分数
取出排名第二的学生及分数,如果没有排名第二的则返回Null

import pandas as pd

def second_highest_salary(employee: pd.DataFrame) -> pd.DataFrame:
	#按降序排名
    employee['rank'] = employee[['salary']].rank(method='dense',ascending=False)
    if len(employee[['salary']].drop_duplicates()) <= 1:
        return pd.DataFrame({'SecondHighestSalary':[None]})
    else:
        return employee[employee['rank'] == 2][['salary']].rename(columns={'salary':'SecondHighestSalary'})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值