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')

标签: none

仅有一条评论

  1. 文章深入浅出,既有深度思考,又不乏广度覆盖,令人叹为观止。

添加新评论