python pandas 使用技巧
所属分类 python
浏览量 204
import pandas as pd
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [10, 20, 30, 20, 15, 30, 45, 50]
})
df.dtypes 返回所有列的数据类型 (不包含索引列)
print(df.info())
value_counts()
返回列或pandas Series中所有唯一值的数量
df['A'].value_counts()
unique()
返回列或pandas Series中所有唯一值
df['A'].unique()
nunique() 返回列或pandas Series中唯一值的数量
df['A'].nunique()
df.sample(3)
随机返回3行
s1 = pd.date_range(start='2024-05-01',periods=7,freq='D')
df['rise20'] = (df['close'] - df['close'].shift(20)) * 100 / (df['close'].shift(20))
# 选择A列值为'foo'且B列值为'one'的行
dfb = df.loc[(df['A'] == 'foo') & (df['B'] == 'one')]
print(dfb)
df['E'] = [None,None,1,2,3,4,5,6]
print(df)
# 删除包含缺失值的行
df2 = df.dropna()
print(df2)
# 删除包含缺失值的列 axis=1
df3 = df.dropna(axis=1)
print(df3)
# apply + lambda表达式
df['E2'] = df['E'].apply(lambda x: x * 2)
print(df)
df['D_plus_E'] = df['D'] + df['E']
print(df)
# 按列B的值分组,并计算列C的平均值
grouped = df.groupby('B')['C'].mean()
print(grouped)
df['A_lower'] = df['A'].str.lower()
print(df)
df2 = df[df['A'].str.startswith('fo')]
print(df2)
df['date']=['2020-01-01','2020-01-06','2022-06-01','2023-09-01','2024-01-01','2024-02-01','2024-03-01','2024-04-01']
df['dt'] = pd.to_datetime(df['date'])
# 按年分组,并计算每年的行数
grouped_by_year = df.groupby(df['date'].dt.year).size()
print(grouped_by_year)
# 按索引排序,并设置为倒序
df_sorted = df.sort_index(ascending=False)
print(df_sorted)
pd.read_csv(), pd.read_excel(), pd.read_sql_query()
df.to_csv(), df.to_excel(), df.to_sql()
astype() 更改数据类型
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4.0, 5.0, 6.0]
})
# A列 转换为浮点数,列 B 转换为整数(会丢失精度)
df = df.astype({'A': float, 'B': int})
# 输出列的数据类型
print(df.dtypes)
replace() 替换值
# 替换 A 列中的 1 为 10,但不修改原 DataFrame
new_df = df['A'].replace(1, 10)
# 使用字典替换 A 列中的值
df['A'].replace({0: 'zero', 4: 'four'}, inplace=True)
数据重塑
pivot() 数据
stack() 和 unstack() 在多层索引之间转换
字符串操作
.str.contains(), .str.replace(), .str.lower(), .str.split()
resample() 对时间序列数据进行重采样
import numpy as np
periods=48
# 创建 时间索引
idx = pd.date_range('2023-01-01', periods=periods, freq='H')
data = {'A': np.random.rand(periods), 'B': np.random.rand(periods)}
df = pd.DataFrame(data, index=idx)
print(df)
# 将数据重新采样 按天 ,计算每列的平均值
daily_avg = df.resample('D').mean()
print(daily_avg)
.dt 获取日期和时间的各个部分(如年、月、日、小时等)
合并与连接
merge() 合并两个 DataFrame
concat() 连接多个 DataFrame
join() 在索引上进行连接
性能优化
apply() 时,尽量使用矢量化操作替代循环
数据探索
info() 查看 DataFrame 的基本信息
describe() 查看数值列的统计摘要
head() 和 tail() 查看数据的前几行或后几行
pandas常用api
isnull()
shape() (列,行数)
groupby ()(分组)
unique 和 nunique (统计)
idxmax 和 argmax idxmin argmin
idxmax: 获取最大值的键
argmax: 获取最大值的下标
reset_index 和 set_index
sort_values (分组后排序)
value_counts() (统计不同值个数)
get_dummies (one-hot)
cut (分组打标签)
replace (替换)
.loc (行:列)
pd.to_numeric
merge (合并数据集)
pivot_table (数据透视表)
drop_duplicates (去重)
describe (统计摘要函数)
df.groupby('xx')['yy'].sum() 对xx字段进行分组,然后按照yy进行求和
count() => 计数
size() => 频率统计
mean() =>平均值
median() =>中位数
std()/var() => 标准差/方差
min()/max() =>最小值/最大值
sum() =>求和
# 重命名列
hs300df.columns=["time","hs300"]
hs300etfdf.columns=["time","hs300etf"]
# 根据时间字段 合并 join
df = pd.merge(hs300df,hs300etfdf,how='inner',on='time')
沪深300指数和沪深300ETF 对比分析 >
使用pandas分析沪深300指数行业权重 >
pandas dataframe merge >
pandas pivot_table 数据透视表 >
pandas matplot 画图 超出阈值 变颜色 >
pandas matplot 读取日线数据,滚动计算bias250 添加阈值线 >
沪深300 线性回归画趋势线 >
pandas 计算 布林通道 和 唐奇通道 >
pandas 股票指数技术分析 >
pandas dataframe 计算收益率 >
多个ETF行情数据join,协方差 相关系数计算 >
zscore因子计算及策略回测 >
沪深300指数 bias250 z20 z250 分析 >
聚宽 沪深300指数 数据读取分析 >
上一篇
下一篇
pandas read_csv 和 to_csv 索引问题
大模型简介
国内大模型
pandas dataframe merge
pandas pivot_table 数据透视表
numpy 实用代码