1.统计汇总函数
分组求众数
# 使用 groupby() 和 mode() 计算每个组的众数
mode_df = df.groupby('Group')['Value'].apply(lambda x: x.mode())
2.数据清洗函数
DataFrame 中将指定列的 NaN 值替换为其他数值
import pandas as pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, None, 4], 'B': [None, 5, 6, 7]}
df = pd.DataFrame(data)
# 将 'A' 列中的 NaN 值替换为 0
df['A'] = df['A'].fillna(0)
# 显示替换后的 DataFrame
print(df)
# 替换所有的 NaN值
df.fillna(0, inplace=True)
对DataFrame进行去重操作可以使用 drop_duplicates() 方法
import pandas as pd
# 假设 df 是你的 DataFrame
# df.drop_duplicates() 默认会保留第一次出现的重复行,并返回一个新的 DataFrame
df_no_duplicates = df.drop_duplicates()
# 如果你想基于特定列进行去重,可以使用 subset 参数指定列名
# 例如,假设你想基于 'column_name' 列进行去重
df_no_duplicates = df.drop_duplicates(subset=['column_name'])
# 如果你想在原始 DataFrame 上进行就地操作,可以添加 inplace=True 参数
df.drop_duplicates(inplace=True)
3.数据筛选函数
4.绘图与元素级运算函数
5.时间序列函数
时间字符串之间的转换
# 字符串转时间
dfprea_rs['occur_dt'] = pd.to_datetime(dfprea_rs['occur_dt'])
# 时间转字符串再截取
dfprea_st32['occur_dt_str'] = dfprea_st32['occur_dt'].dt.strftime('%Y-%m-%d %H:%M:%S').str[:15]
dfprelo2['occur_dtday'] = dfprelo2['occur_dt'].astype(str).str[:10]
计算时间差
dfprea_st_20['time_diff'] = (dfprea_st_20['occur_dt_1']- dfprea_st_20['occur_dt']).dt.total_seconds() / 60
6.其他函数
求下一条数据
dfprea_st_20['outlet_set_temp_f'] = dfprea_st_20.groupby(['serial_no','in_serial_no'])['outlet_set_temp'].shift(-1)
字符串截取与拼接
df['ID_short'] = df['ID'].str[:2] # 截取前两个字符
# 使用加号运算符拼接两列
df['Full_Name'] = df['First_Name'] + ' ' + df['Last_Name']
字段转string 类型 类型转换
df['A'] = df['A'].astype(str) # 将列 'A' 转换为字符串类型
dfprelo1['occur_dt_tsp'] = dfprelo1['occur_dt_tsp'].astype(int)
merge() 方法用于将两个 DataFrame 按照指定的列进行合并
import pandas as pd
# 创建两个示例 DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': [5, 6, 7, 8]})
# 使用 merge() 方法按照 'key' 列进行合并
merged_df = pd.merge(df1, df2, on='key')
# 打印合并后的 DataFrame
print(merged_df)
# 左连接或右连接
merged_df = pd.merge(df1, df2, on='key', how='left')
rename() 方法来重命名 DataFrame 中的列或行
import pandas as pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)
# 将列 'A' 重命名为 'X'
df = df.rename(columns={'A': 'X'})
# 打印重命名后的 DataFrame
print(df)
DataFrame中查询某一字段以特定字符串开头的数据
import pandas as pd
# 假设 df 是你的 DataFrame,columnName 是你要查询的字段名
# 例如,如果你的 DataFrame 中有一个名为 'ID' 的字段,你可以这样查询以 'F412' 开头的数据
result = df[df['ID'].str.startswith('F412')]
# 如果你想要忽略大小写,你可以使用 case 参数
# result = df[df['ID'].str.startswith('F412', case=False)]
# 输出查询结果
print(result)
dataframe 对某一列的内容进行替换
import pandas as pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 1, 2, 1],
'B': [3, 4, 5, 6, 7]}
df = pd.DataFrame(data)
# 将列'A'中的值进行替换
replacement_mapping = {1: '高', 2: '低'}
df['A'] = df['A'].replace(replacement_mapping)
print(df)
DataFrame 的索引转换为列
import pandas as pd
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)
# 设置索引
df.set_index('A', inplace=True)
# 将索引转换为列
df_reset = df.reset_index()
# 打印转换后的 DataFrame
print(df_reset)
使用 concat() 进行垂直或水平合并
# 垂直合并(行拼接)
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
# 垂直合并
df_concat = pd.concat([df1, df2], ignore_index=True) # 忽略索引并重新生成
print(df_concat)
# 水平合并(列拼接)
df3 = pd.DataFrame({'C': ['x', 'y']})
df4 = pd.DataFrame({'D': ['w', 'z']})
# 水平合并
df_concat_horizontal = pd.concat([df3, df4], axis=1) # axis=1 表示列拼接
print(df_concat_horizontal)
要删除包含NaN值的行,可以使用pandas的dropna方法
# 删除包含任何NaN的行
df.dropna(inplace=True)
# 只删除全为NaN的行
df.dropna(how='all', inplace=True)
# 删除包含NaN的指定列的行
df.dropna(subset=['col1', 'col2'], inplace=True)
pivot() 方法进行行转列
import pandas as pd
# 创建一个示例 DataFrame
data = {'date': ['2024-06-01', '2024-06-01', '2024-06-02', '2024-06-02'],
'city': ['New York', 'Los Angeles', 'New York', 'Los Angeles'],
'temperature': [75, 80, 70, 85]}
df = pd.DataFrame(data)
display(df)
# 使用 pivot() 方法将长格式数据转换为宽格式
pivot_df = df.pivot(index='date', columns='city', values='temperature')
pivot_df
pivot之后的多重索引怎么转化为单层
# 重设columns/index
pivot_df.columns = [col for col in pivot_df.columns] # 提取内层列名
pivot_df.index = pivot_df.index.get_level_values(0) # 提取外层行索引
pivot_df
20241204新增
matplotlib格式化横轴时间标签
# 格式化横轴时间标签 axx 和 plt.gca() 等价
# axx.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M')) # 自定义时间格式
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M')) # 自定义时间格式
# 旋转 X 轴标签 45 度
plt.xticks(rotation=45)
dataframe 类型转换
# 将 'a' 列转换为 float 类型
df['a'] = df['a'].astype(float)
postgresql 计算时间差
EXTRACT(EPOCH FROM(a.trig_datetime_next - a.trig_datetime))/3600 AS hours_diff
dataframe c列的科学计数法转为正常形式
# 对 c 列应用格式化函数
slopes_df['Slope'] = slopes_df['Slope'].apply(lambda x: f"{x:.6f}") # 保留6位小数
dataframe 按a列分组 b列排序,计算c列拟合增长线的斜率
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
# 创建示例 DataFrame
df = pd.DataFrame({
'a': ['X', 'X', 'X', 'Y', 'Y', 'Z'],
'b': [3, 1, 2, 2, 1, 1],
'c': [30, 10, 20, 15, 5, 8]
})
# 按 'a' 列分组,'b' 列排序
df_sorted = df.sort_values(by=['a', 'b'])
# 定义一个函数来计算每组数据的线性拟合斜率
def calculate_slope(group):
# 线性回归模型
model = LinearRegression()
# 重塑 b 列为二维数组(sklearn 需要)
X = group['b'].values.reshape(-1, 1)
y = group['c'].values
# 拟合模型
model.fit(X, y)
# 返回斜率
return model.coef_[0]
# 对每个分组计算斜率
slopes = df_sorted.groupby('a').apply(calculate_slope)
# 打印每组的斜率
print(slopes)
dataframe 基于unit_id有300多个用户 随机抽取100个用户的所有数据
import pandas as pd
# 假设你的 DataFrame 名为 df
# 示例 DataFrame 创建
df = pd.DataFrame({
'unit_id': ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'A', 'B', 'C', 'D'],
'user_id': range(1, 13),
'data': [x * 10 for x in range(1, 13)]
})
# 假设 DataFrame 已经包含了 300 多个用户数据
# 随机抽取 100 个不同的 unit_id
sample_unit_ids = df['unit_id'].drop_duplicates().sample(n=100, random_state=42)
# 根据选中的 100 个 unit_id 获取所有相应用户数据
sample_data = df[df['unit_id'].isin(sample_unit_ids)]
# 输出抽取后的数据
print(sample_data)
excel b列为省份,c列也为省份但和b列顺序不同,d列为基于c列的每个省份的用户数,如何调整为b列的顺序
=INDEX(D:D, MATCH(B2, C:C, 0))
matplotlib 绘制一条与X轴平行刻度在30 的直线 并添加标注
# 绘制与 X 轴平行的直线,Y 坐标为 30
plt.axhline(y=30, color='r', linestyle='-', linewidth=2)
# 添加标注文本
plt.text(5, 30, 'y = 30', fontsize=12, color='black', ha='center', va='bottom')
文章深入浅出,既有深度思考,又不乏广度覆盖,令人叹为观止。