切换到宽版
  • 1659阅读
  • 13回复

Pandas 速查手册 [复制链接]

上一主题 下一主题
离线白山

发帖
3187
金币
11739
威望
113
贡献值
18
开心币
365
只看该作者 10楼 发表于: 2021-05-21
数据合并
# 合并拼接行
# df2中的行添加到df1的尾部
df1.append(df2)
# 指定列合并成一个新表新列
ndf = (df['提名1']
      .append(df['提名2'], ignore_index=True)
      .append(df['提名3'], ignore_index=True))
ndf = pd.DataFrame(ndf, columns=(['姓名']))
# df2中的列添加到df1的尾部
df.concat([df1, df2], axis=1)

# 合并文件的各行
df1 = pd.read_csv('111.csv', sep='\t')
df2 = pd.read_csv('222.csv', sep='\t')
excel_list = [df1, df2]
# result =pd.concat(excel_list).fillna('')[:].astype('str')
result = pd.concat(excel_list)[]
result.to_excel('333.xlsx', index=False)
# 合并指定目录下所有的 excel(csv) 文件
import glob
files = glob.glob("data/cs/*.xls")
dflist = []
for i infiles:
    dflist.append(pd.read_excel(i,usecols=['ID', '时间', '名称']))

df = pd.concat(dflist)

# 合并增加列
# df1的列和df2的列执行SQL形式的join
df1.join(df2,on=col1,how='inner')
# key 合并两个表
df_all = pd.merge(df_sku, df_spu,
                  how='left',
                  left_on=df_sku['product_id'],
                  right_on=df_spu['p.product_id'])
成功=艰苦劳动+正确方法+少说空话 --爱因斯坦
离线白山

发帖
3187
金币
11739
威望
113
贡献值
18
开心币
365
只看该作者 11楼 发表于: 2021-05-21
时间处理 时间序列
df.index = pd.DatetimeIndex(df.index)
# 时间只保留日期
df['date'] = df['time'].dt.date
# 将指定字段格式化为时间类型
df["date"] = pd.to_datetime(df['时间'])
# 转化为北京时间
df['time'] = df['time'].dt.tz_convert('Asia/Shanghai')
# 转为指定格式,可能会失去秒以后的精度
df['time'] = df['time'].dt.strftime("%Y-%m-%d %H:%M:%S")
dc.index = pd.to_datetime(dc.index, format='%Y%m%d', errors='ignore')
# 时间,参与运算
pd.DateOffset(days=2)
# 当前时间
pd.Timestamp.now()
pd.to_datetime('today')
# 判断时间是否当天
pd.datetime.today().year == df.start_work.dt.year
df.time.astype('datetime64[ns]').dt.date == pd.to_datetime('today')
# 定义个天数
import datetime
days = lambda x: datetime.timedelta(days=x)
days(2)
# 同上,直接用 pd 包装的
pd.Timedelta(days=2)
# unix 时间戳
pd.to_datetime(ted.film_date, unit='ms')
# 按月(YMDHminS)采集合计数据
df.set_index('date').resample('M')['quantity'].sum()
df.set_index('date').groupby('name')['ext price'].resample("M").sum()
# 按天汇总,index 是 datetime 时间类型
df.groupby(by=df.index.date).agg({'uu':'count'})
# 按周汇总
df.groupby(by=df.index.weekday).uu.count()
# 按月进行汇总
df.groupby(['name', pd.Grouper(key='date', freq='M')])['ext price'].sum()
# 按月进行汇总
df.groupby(pd.Grouper(key='day', freq='1M')).sum()
# 按照年度,且截止到12月最后一天统计 ext price 的 sum 值
df.groupby(['name', pd.Grouper(key='date', freq='A-DEC')])['ext price'].sum()
# 按月的平均重新采样
df['Close'].resample('M').mean()
# https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases
# 取时间范围,并取工作日
rng = pd.date_range(start="6/1/2016",end="6/30/2016",freq='B')
# 重新定时数据频度,按一定补充方法
df.asfreq('D', method='pad')
# 时区,df.tz_convert('Europe/Berlin')
df.time.tz_localize(tz='Asia/Shanghai')
# 转北京时间
df['Time'] = df['Time'].dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')
# 查看所有时区
from pytz import all_timezones
print (all_timezones)
# 时长,多久,两个时间间隔时间,时差
df['duration'] = pd.to_datetime(df['end']) - pd.to_datetime(df['begin'])
# 指定时间进行对比
df.Time.astype('datetime64[ns]') < pd.to_datetime('2019-12-11 20:00:00', format='%Y-%m-%d %H:%M:%S')
成功=艰苦劳动+正确方法+少说空话 --爱因斯坦
离线白山

发帖
3187
金币
11739
威望
113
贡献值
18
开心币
365
只看该作者 12楼 发表于: 2021-05-21


常用备忘



# 解决科学计数法问题
df = pd.read_csv('111.csv', sep='\t').fillna('')[:].astype('str')
# 和订单量相关性最大到小显示
dd.corr().total_order_num.sort_values(ascending=False)

# 解析列表、json 字符串
import ast
ast.literal_eval("[{'id': 7, 'name':'Funny'}]")

# Series apply method applies a functionto
# every element in a Series and returnsa Series
ted.ratings.apply(str_to_list).head()
# lambda is a shorter alternative
ted.ratings.apply(lambda x: ast.literal_eval(x))
# an even shorter alternative is toapply the
# function directly (without lambda)
ted.ratings.apply(ast.literal_eval)
# 索引 index 使用 apply()
df.index.to_series().apply()

成功=艰苦劳动+正确方法+少说空话 --爱因斯坦
离线白山

发帖
3187
金币
11739
威望
113
贡献值
18
开心币
365
只看该作者 13楼 发表于: 2021-05-21
样式显示
  df['per_cost'] = df['per_cost'].map('{:,.2f}%'.format)  # 显示%比形式
# 指定列表(值大于0)加背景色
df.style.applymap(lambda x: 'background-color:grey' if x>0 else '',
                  subset=pd.IndexSlice[:, ['B','C']])

# 最大值最小值加背景色
df.style.highlight_max(color='lightgreen').highlight_min(color='#cd4f39')
df.style.format('{:.2%}', subset=pd.IndexSlice[:,['B']]) # 显示百分号

# 指定各列的样式
format_dict = {'sum':'${0:,.0f}',
                       'date': '{:%Y-%m}',
                       'pct_of_total': '{:.2%}'
                       'c': str.upper}

# 一次性样式设置
(df.style.format(format_dict) # 多种样式形式
    .hide_index()
    #指定列按颜色深度表示值大小, cmap matplotlib colormap
    .background_gradient(subset=['sum_num'],cmap='BuGn')
    #表格内作横向 bar 代表值大小
    .bar(color='#FFA07A',vmin=100_000, subset=['sum'], align='zero')
    #表格内作横向 bar 代表值大小
    .bar(color='lightgreen',vmin=0, subset=['pct_of_total'], align='zero')
    #下降(小于0)为红色, 上升为绿色
    .bar(color=['#ffe4e4','#bbf9ce'],vmin=0, vmax=1, subset=['增长率'], align='zero')
    #给样式表格起个名字
    .set_caption('2018Sales Performance')
    .hide_index())

# 按条件给整行加背景色(样式)
def background_color(row):
    ifrow.pv_num >= 10000:
       return ['background-color: red'] * len(row)
    elifrow.pv_num >= 100:
       return ['background-color: yellow'] * len(row)
    return[''] * len(row)
# 使用
df.style.apply(background_color, axis=1)

成功=艰苦劳动+正确方法+少说空话 --爱因斯坦
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个