DataFrame​(数据框)

一种二维表格型数据结构,类似于电子表格(如 Excel)或 SQL 表,由行(记录)​列(字段)​组成。它是数据分析、机器学习和科学计算中最常用的数据结构之一,尤其在 ​Python 的 Pandas 库​ 中被广泛使用。


1. DataFrame 的核心特点

特点说明
二维结构类似表格,有行(记录)和列(字段)。
列名(Column Names)​每列有一个名称(如 nameagesalary)。
行索引(Index)​每行有一个索引(默认从 0 开始,也可自定义)。
异构数据不同列可以存储不同类型的数据(如数字、字符串、布尔值)。
灵活操作支持筛选、排序、分组、合并等高级操作。

2. DataFrame 的常见用途

  • 数据分析​(如统计、聚合、可视化)
  • 机器学习​(特征工程、数据预处理)
  • 数据库查询结果​(类似 SQL 表)
  • 金融、电商、医疗等领域的数据处理

3. DataFrame 的示例(Python Pandas)​

import pandas as pd

# 创建一个 DataFrame
data = {
    "Name": ["Alice", "Bob", "Charlie"],
    "Age": [25, 30, 35],
    "Salary": [50000, 60000, 70000]
}

df = pd.DataFrame(data)

print(df)

输出:​

      Name  Age  Salary
0    Alice   25   50000
1      Bob   30   60000
2  Charlie   35   70000
  • 列名​:NameAgeSalary
  • 行索引​:0, 1, 2
  • 数据类型​:Name(字符串)、Age(整数)、Salary(整数)

4. DataFrame 的常见操作

操作示例
查看数据df.head()(前 5 行)、df.describe()(统计摘要)
筛选数据df[df["Age"] > 30](筛选年龄大于 30 的行)
新增列df["Bonus"] = df["Salary"] * 0.1(新增奖金列)
排序df.sort_values("Salary", ascending=False)(按薪资降序排序)
分组聚合df.groupby("Age")["Salary"].mean()(按年龄分组计算平均薪资)
合并 DataFramepd.concat([df1, df2]) 或 pd.merge(df1, df2)

5. DataFrame 与其他数据结构的区别

数据结构特点适用场景
DataFrame二维表格,支持列操作数据分析、机器学习
Series一维数组(DataFrame 的列)单变量分析
NumPy 数组多维数组,仅支持数值计算科学计算、矩阵运算
SQL 表数据库中的二维表数据存储、查询

6. DataFrame 的应用场景

  • 金融分析​(股票数据、交易记录)
  • 电商数据分析​(用户行为、销售数据)
  • 医疗数据​(病人记录、诊断结果)
  • 机器学习​(特征工程、数据预处理)

总结

  • DataFrame 是一种二维表格数据结构,类似于 Excel 或 SQL 表。
  • Pandas 的 DataFrame 是最常用的实现,支持灵活的数据操作。
  • 适用于数据分析、机器学习、数据库查询等场景

首先通过前向填充的方式处理了 '年', '月', '日' 列中的空值(NaN),然后将这些列的数据类型转换为整数型(Int64)。 # 将 '年', '月', '日' 列中的空值(NaN)用前面的非空值进行填充 v_source[['年','月','日']] = v_source[['年','月','日']].___(___='___') # 将 '年', '月', '日' 列中的数据类型转换为整数型(Int64),适用于处理缺失值后的数据列 v_source['年'] = v_source['年'].___('Int64') v_source['月'] = v_source['月'].___('Int64') v_source['日'] = v_source['日'].___('Int64') v_source 重置 运行 (6)从数据框v_source中筛选出【总账科目】列包含"库存商品"的行,并选择【明细科目】、【入库数量】和【借方金额】这三列数据,并将结果存储在数据框buy_data中。 # 筛选出总账科目包含 '库存商品' 的数据行 buy_data = v_source[___['___'].___.___('___')] #选择 '明细科目', '入库数量', '借方金额' 列 buy_data = buy_data[['明细科目','___','借方金额']] buy_data 重置 运行 (7)将数据框buy_data按照"明细科目"列进行分组,并对每个分组内的【入库数量】和【借方金额】进行求和操作,得到每个明细科目的总入库数量和总借方金额。 buy_data = ___.___(['___']).___() buy_data 重置 运行 (8)将两个数据框qcye_df和buy_data按照它们的索引进行外连接,并将结果保存到kc_data,然后计算了期初与本期入库数量、期初与本期进价,并计算了月末一次加权平均单价。最后,选择了期初数量和月末一次加权平均单价列,并重置了数据框的索引。 # 将 qcye_df 和 buy_data 数据框按照索引进行外连接 kc_data = ___.___(qcye_df,buy_data ,right_index=___,left_index=___,___='___')#两表拼接 #期初与本期入库数量=期初数量+入库数量 kc_data['期初与本期入库数量'] =kc_data['___']+kc_data['___'] #期初与本期进价=借方余额+借方金额 kc_data['期初与本期进价'] =kc_data['借方余额']+kc_data['___'] #月末一次加权平均单价=期初与本期进价/期初与本期入库数量 kc_data['月末一次加权平均单价'] = (kc_data['___']/kc_data['期初与本期入库数量']) # 选择并重置列,保留 '期初数量' 和 '月末一次加权平均单价' 列 kc_data = kc_data[['___','月末一次加权平均单价']] # 重置索引 kc_data = kc_data.___() kc_data 重置 运行 (9)从数据框 v_source 中选择包含 '主营业务收入' 或 '库存商品' 总账科目的数据行。 sales_data = v_source[(___['___'].___.___('主营业务收入'))|(___['___'].___.___('库存商品'))] sales_data 重置 运行 (10)首先根据 '-' 分割 '明细科目' 列,创建新的 '二级科目' 和 '产品内容' 列。然后根据 '总账科目' 的值进行条件处理:如果总账科目是 '主营业务收入',则保留相应的 '二级科目' 和 '产品内容' 值;否则,将 '二级科目' 列置空,而 '产品内容' 则保留 '明细科目' 列的值。 # 创建新的列 '二级科目' 和 '产品内容',根据 '明细科目' 列使用 '-' 分割 sales_data[['二级科目', '产品内容']] = sales_data['___'].___.___('-', 1, ___=___) ​ # 根据总账科目进行条件处理 # 如果 '总账科目' 是 '主营业务收入',则保留 '二级科目' 列的值,否则置空 sales_data['二级科目'] = ___.___(sales_data['___'] == '___', sales_data['___'], '') # 如果 '总账科目' 是 '主营业务收入',则保留 '产品内容' 列的值,否则使用 '明细科目' 列的值 sales_data['产品内容'] = ___.___(sales_data['___'] == '___', sales_data['___'], sales_data['___']) sales_data 重置 运行 (11)首先根据条件修改了 sales_data 数据框中的 '借方金额' 和 '贷方金额' 列的值,然后使用重命名方法将列名 '出库数量' 改为 '销量','贷方金额' 改为 '销售额','借方金额' 改为 '采购额'。 # 根据总账科目进行条件赋值 # 如果 '总账科目' 是 '主营业务收入',则将 '借方金额' 列的值设为 0,否则保留原值 sales_data['借方金额'] = ___.___(sales_data['___'] == '___', 0, sales_data['___']) # 如果 '总账科目' 是 '库存商品',则将 '贷方金额' 列的值设为 0,否则保留原值 sales_data['贷方金额'] = ___.___(sales_data['___'] == '___', 0, sales_data['___']) # 对列名进行重命名 sales_data = sales_data.___(___={'___':'销量','贷方金额':'___','___':'采购额'}) sales_data 重置 运行 (12)从 sales_data 数据框中重新选择特定列,并按照指定顺序重新排列列的顺序。选择的列包括 '年', '月', '日', '产品内容', '入库数量', '采购额', '销售额', '销量'。 # 重新选择并排序 sales_data 数据框中的列 sales_data = ___[['年', '月', '日','___','入库数量','采购额','___','销量']] sales_data 重置 运行 (13)对 sales_data 数据框按照指定的列进行分组,并对其他列进行求和计算,然后根据条件过滤和重置索引。 # 按照 '日' 和 '产品内容' 列进行分组,对 '入库数量', '采购额', '销量', '销售额' 列进行求和计算 sales_data = sales_data.___([ '日','___'])[['入库数量','___','销量','销售额']].___() # 过滤掉所有列求和为零的行 sales_data = sales_data[sales_data.___(___=___)!=0] # 重置索引 sales_data = sales_data.___() sales_data 重置 运行 (14)使用循环和条件筛选来处理每日的销售和库存数据,并根据实际业务逻辑计算库存量和库存金额。 # 初始化库存数量和每单位价格字典 initial_inventory = {row['明细账科目']: row['期初数量'] for _, row in kc_data.iterrows()} unit_prices = {row['明细账科目']: row['月末一次加权平均单价'] for _, row in kc_data.iterrows()} ​ # 创建一个字典来存储每种产品的每日库存 daily_inventory = {product: [] for product in initial_inventory.keys()} ​ # 计算每日库存数量和库存金额 ___ day ___ range(1, 32): # 假设每个月有31天,可以根据实际情况调整范围 ___ product ___ initial_inventory.keys(): # 获取当天的销售数据 daily_sales = sales_data[(sales_data['日'] == day) & (sales_data['产品内容'] == product)] # 更新库存数量 for _, sale in daily_sales.iterrows(): initial_inventory[product] += sale['入库数量'] - sale['销量'] # 计算库存金额 inventory_value = initial_inventory[product] * unit_prices[product] # 将每日库存情况添加到字典中 daily_inventory[product].___({ '日': day, '库存数量': initial_inventory[product], '库存金额': inventory_value }) ​ # 将字典转换为DataFrame result = [] ___ product, records ___ daily_inventory.items(): ___ record ___ records: result.append({ '日': record['日'], '产品内容': product, '库存数量': record['库存数量'], '库存金额': record['库存金额'] }) ​ inventory_df = pd.DataFrame(result) inventory_df 重置 运行 (15)对 inventory_df 数据框中的 '产品内容' 列进行操作,通过 '-' 分割该列的值,并将分割后的第一部分(产品大类)和第二部分(产品明细)分别分配给新的列 '产品大类' 和 '产品明细'。 inventory_df[['产品大类','产品明细']] = inventory_df['___'].___.___('-',1,___=___) inventory_df 重置 运行 (16)根据 inventory_df 数据框中的数据生成一个透视表,将每日的产品大类与库存金额进行汇总统计。 daily_data = ___.___(inventory_df,___='日',___='产品大类',___='库存金额',___='sum') daily_data 重置 运行 (17)绘制堆积条形图,展示每日不同产品大类的库存金额结构。 import matplotlib.pyplot as plt # 设置中文字体 plt.rcParams['font.family'] = 'kaiTi' # 用楷体显示中文 ​ # 绘制堆积图 ax = ___.plot(___='___', stacked=True, figsize=(10, 5), colormap='viridis') ​ # 设置图表标题和标签 ax.___('每日库存金额结构堆积图', fontsize=16) ax.set_xlabel('日', fontsize=14) ax.set_ylabel('库存金额', fontsize=14) plt.xticks(rotation=0)# 设置 x 轴刻度标签不旋转 ​ # 显示图例 ___.___(title='产品大类', title_fontsize='13', fontsize='11') ​ # 显示图表 ___.___() 重置 运行 (18)筛选出日期为31日的库存数据,并针对每种产品明细统计总库存金额和库存数量,然后绘制两个水平条形图子图展示前十名产品明细。 # 筛选出日期为31日的数据 inventory_31 = inventory_df[___['日'] == 31] ​ # 统计每种产品的总库存金额和库存数量 total_inventory = inventory_31.groupby('产品明细').agg({ '库存数量': '___', '库存金额': '___' }).reset_index() ​ # 排序并获取前十名,按降序排列 top_10_amount = total_inventory.nlargest(10, '库存金额').___(by='库存金额', ascending=True) top_10_quantity = total_inventory.nlargest(10, '库存数量').___(by='库存数量', ascending=True) ​ # 提取产品明细和数值 top_10_amount_names = top_10_amount['产品明细'] top_10_amount_values = top_10_amount['库存金额'] ​ top_10_quantity_names = top_10_quantity['产品明细'] top_10_quantity_values = top_10_quantity['库存数量'] ​ # 绘制两个水平条形图子图 fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(14, 5)) ​ # 绘制库存金额前十名水平条形图 axes[0].___(___, ___, color='skyblue') axes[0].set_xlabel('库存金额', fontsize=12) axes[0].set_title('库存金额前十名产品明细 (日期为31日)', fontsize=14) ​ # 绘制库存数量前十名水平条形图 axes[1].___(___, ___, color='lightgreen') axes[1].set_xlabel('库存数量', fontsize=12) axes[1].set_title('库存数量前十名产品明细 (日期为31日)', fontsize=14) ​ # 显示图表 ___.___() 重置 运行 上一题 下一题
最新发布
09-22
以下是使用Python和pandas库完成你所要求的一系列Excel数据处理、分析操作的代码示例: ```python import pandas as pd import matplotlib.pyplot as plt # 读取Excel文件 file_path = 'excel/BKTK/合肥盛达商贸有限责任公司业财资料.xlsx' df = pd.read_excel(file_path, sheet_name='记账凭证') # 填充和转换'年''月''日'列数据 df['日期'] = pd.to_datetime(df[['年', '月', '日']]) df.drop(['年', '月', '日'], axis=1, inplace=True) # 筛选总账科目含'库存商品'数据 df_stock = df[df['总账科目'].str.contains('库存商品', na=False)] # 分组求和 grouped_sum = df_stock.groupby(['日期', '总账科目'])['金额'].sum().reset_index() # 外连接数据框计算加权平均单价(假设已有另一个数据框df2) # 这里简单模拟一个df2 data = {'日期': [pd.Timestamp('2024-01-01'), pd.Timestamp('2024-01-02')], '数量': [100, 200]} df2 = pd.DataFrame(data) merged_df = pd.merge(grouped_sum, df2, on='日期', how='outer') merged_df['加权平均单价'] = merged_df['金额'] / merged_df['数量'] # 筛选含'主营业务收入'或'库存商品'数据 df_filtered = df[df['总账科目'].str.contains('主营业务收入|库存商品', na=False)] # 分割列并条件处理(假设分割摘要列) df_filtered[['摘要_1', '摘要_2']] = df_filtered['摘要'].str.split(' ', expand=True) df_filtered['新列'] = df_filtered['摘要_1'].apply(lambda x: '条件满足' if '特定条件' in x else '条件不满足') # 重命名列 df_filtered.rename(columns={'摘要': '原摘要'}, inplace=True) # 重新选择和排序列 selected_columns = ['日期', '总账科目', '原摘要', '摘要_1', '摘要_2', '新列', '金额'] df_filtered = df_filtered[selected_columns] # 分组求和过滤 grouped_filtered = df_filtered.groupby(['日期', '总账科目'])['金额'].sum().reset_index() grouped_filtered = grouped_filtered[grouped_filtered['金额'] > 100] # 循环计算每日库存(假设已有初始库存) initial_stock = 1000 daily_stock = [] for i in range(len(grouped_sum)): if i == 0: daily_stock.append(initial_stock + grouped_sum['金额'][i]) else: daily_stock.append(daily_stock[i - 1] + grouped_sum['金额'][i]) grouped_sum['每日库存'] = daily_stock # 生成透视表 pivot_table = pd.pivot_table(df_stock, values='金额', index='日期', columns='总账科目', aggfunc='sum') # 绘制堆积条形图和水平条形图子图 fig, axes = plt.subplots(2, 1, figsize=(10, 10)) # 堆积条形图 pivot_table.plot(kind='bar', stacked=True, ax=axes[0]) axes[0].set_title('堆积条形图') # 水平条形图 pivot_table.plot(kind='barh', ax=axes[1]) axes[1].set_title('水平条形图') plt.tight_layout() plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值