pandas 常用操作 group apply sum filter concat 调整列顺序

项目里计算量较大 需要用pandas算 这里记录一下常用操作

import pandas as pd

# 常用配置
pd.set_option('mode.chained_assignment', None)
# 显示所有列
pd.set_option('display.max_columns', 500)
# 显示所有行
pd.set_option('display.max_rows', 500)
# # 设置value的显示长度为100,默认为50
pd.set_option('max_colwidth', 1000)
pd.set_option('expand_frame_repr', False)

# 读csv
pd.read_csv(ALL_DATA_PATH)

# list创建df
df = pd.DataFrame([])

# round
data = data.round(2)

# in操作 这里的ptf_resource 可以是list 或者dict
data = data[data.portfolio.isin(ptf_resource)]

def to_timestamp(s):
    s = str(s)
    time_array = time.strptime(s, "%Y%m%d")
    timestamp = int(time.mktime(time_array))
    return timestamp * 1000

# group 操作
for ptf_data, ptf_group in trading_day_group.groupby('portfolio'):
	# 新增列 apply一个方法
	ptf_group['trading_day_timestamp'] = ptf_group.trading_day.apply(to_timestamp)
	
	# df转dict
	leaf_data = ptf_group.to_dict(orient='records')

# apply 多列
result['today_sell'] = result[['feedcode', 'today_sell']]. \
        apply(lambda x: x['today_sell'] // 100 if volume_func(x['feedcode']) else x['today_sell'], axis=1)

# 一些字段求加和
node = df[
        ['pnl', 'fee', 'net_pnl', 'turnover', 'nominal', 'ystd_nominal', 'today_pnl', 'ystd_pnl', 'itd_pnl',
         'itd_fee', 'ytd_pnl', 'ytd_fee']].sum()

# 查找某条件固定的值
all[all.portfolio_id==22198].iloc[0].pnl

# 追加到文件
pnl_data.to_csv(PNL_PATH, mode='a', encoding='utf-8', header=False, index=False)

# 新建文件
result2.to_csv('C:\\Users\\aaa\\Desktop\\result_0826.csv', index=False)

# 累加
tmp['ytd_pnl'] = tmp['pnl'].cumsum()

# 排序
feed_data.sort_values(by='trading_day')

# 转换时间格式
feed_data['trading_day2'] = pd.to_datetime(feed_data['trading_day2'], format='%Y%m%d')

# 重设index
feed_data = feed_data.set_index('trading_day2')

# 连接df
pd.concat(final_feed_data, axis=0)

# NaN 转换为0
result2 = result2.fillna(0)

#重设index
result2 = result2.reset_index()

# filter部分
new_pnl_data = pnl_data[pnl_data['trading_day'] < day]
# 或
new_pnl_data = pnl_data[pnl_data.trading_day < day]

# 调整列顺序
df = df[['user_id','book_id','rating','mark_date']] # 调整列顺序为'user_id','book_id','rating','mark_date'

# 调整index为从1开始
df.index = range(1,len(df) + 1)

# 重命名列名
a.rename(columns={'A':'a', 'B':'b', 'C':'c'}, inplace = True)

# 添加列名
df.columns = ['trading_day', 'iq', 'account_id']

# 取不包含
 df = df[~df['underlying_code'].isin(['000300.SH', '159919.SZ', '510050.SH', '510300.SH'])]

#groupby 多列
df.groupby(['underlying_code', 'group_tag']).sum()

# 将index列转换为普通列
df_g = df_g.reset_index('group_tag', drop=False)

# 删除列,不存在列时忽略(否则会报错)
mo_df.drop(['trading_day', 'portfolio_id', 'portfolio', 'feedcode'], axis=1, inplace=True, errors='ignore')

# 正则筛选行
ret = r'[0-9]{8}.S[HZ]'
option_df_spe = option_df[option_df.feedcode.str.contains(ret, regex=True)] # 股指期权

# 解决中文乱码
 df.to_csv(file_name2, encoding='utf_8_sig') 

# join操作
result = pd.merge(init_df, stock_event, how='left', on=['trading_day', 'feedcode'])

# 设置index
new_day.index = ['2021-07-20']

# index转换为datetime类型
new_day.index = pd.to_datetime(new_day.index)

# 普通列转换为datetime类型
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

# 读取数据的时候,第0列作为index
dce_eg = pd.read_csv('D:\\limit_result_dce_eg.csv', index_col=0)

# append
ticker_df = ticker_df.append(new_day)

# 填充NaN值
import numpy as np
df.test = np.nan

# 修改符合条件某列的值
df.loc[df.ptf=='abc', 'trading_day'] = '20231117'


# 大数据量for循环loc取会很慢,推荐用 group
for index,today_df in df.groupby('date'):
	print(index, today_df )

可以判断pandas中单个空值对象的方式:
1、利用pd.isnull(),pd.isna();
2、利用np.isnan();
3、利用is表达式;
4、利用in表达式。

不可以用来判断pandas单个空值对象的方式:
1、不可直接用==表达式判断;
2、不可直接用bool表达式判断;
3、不可直接用if语句判断。

df.equals(df2)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PandasPython中广受欢迎的数据分析库,可以轻松地对各种数据进行清洗、整理、分析和可视化处理。在数据处理中,经常需要对数据的顺序进行调整,同时还要对数据进行重置索引。Pandas提供了reset_index()方法和reindex()方法来实现这个功能。 reset_index()方法可以将索引转换为普通,同时创建一个新的默认的数字索引。可以通过参数来指定要保留的索引,以及重置后的索引的名称。 下面是一个Pandas调整顺序reset_index()的例子: import pandas as pd data = {'name':['Tom', 'Jerry', 'Spike', 'Tyke'], 'age':[20, 30, 25, 5], 'country':['USA', 'UK', 'Canada', 'Japan']} df = pd.DataFrame(data) print("Before column reordering and resetting index:\n", df) #调整顺序 df = df[['country', 'name', 'age']] #重置索引 df = df.reset_index(drop=True) print("\nAfter column reordering and resetting index:\n", df) 运行结果如下所示: Before column reordering and resetting index: name age country 0 Tom 20 USA 1 Jerry 30 UK 2 Spike 25 Canada 3 Tyke 5 Japan After column reordering and resetting index: country name age 0 USA Tom 20 1 UK Jerry 30 2 Canada Spike 25 3 Japan Tyke 5 从运行结果可以看出,首先对数据框的进行了调整顺序,然后通过reset_index()方法重置了索引并生成了默认的数字索引。需要注意的是,当我们对重置后的索引值不感兴趣时,可以使用drop=True来删除索引

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值