使用pandas读取本地文件的函数是 使用pandas读取excel文件并画曲线

详细阐述了如何利用pandas库,结合`melt`、`merge_asof`和`pivot`等转换操作,根据另一个dataframe中定义的日期范围条件,灵活地填充目标dataframe中的数据。通过将宽格式数据为长格式进行近似校准,并结合精准的数据范围检查,实现复杂的数据匹配与填充需求。引言
在数据分析和处理过程中,我们经常会遇到需要根据特定条件从一个数据集填充或更新另一个数据集的场景。当这些条件涉及日期范围时,问题会变得适应。本教程将介绍一种高效且灵活的方法,利用Pandas的melt、merge_asof和pivot功能,解决根据日期范围条件从一个DataFrame填充另一个DataFrame数据的需求。数据准备
假设我们有两个DataFrame:df1包含公司及其对应的有效日期范围(开始日期和结束日期)。df2 包含每日数据,其中列名为公司名称,行索引为日期。
我们的目标是创建一个新的 DataFrame df3,结构与 df2 类似,但只保留 df2 中在 df1 定义的有效日期范围内的公司数据,超出范围的数据应显示为 NaN。
以下是示例数据:import pandas as pd# df1:定义公司及其有效日期范围data1 = { '公司': ['a', 'b', 'c', 'd'], '开始日期': ['2023-01-02', '2023-01-05', '2023-01-04', '2023-01-03'], '结束日期': ['2023-01-06', '2023-01-12', '2023-01-13', '2023-01-10']}df1 = pd.DataFrame(data1)# df2:包含每日数据的DataFramedata2 = { 'DATE': ['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13'], 'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'b': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 'c': [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], 'd': [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]}df2 = pd.DataFrame(data2)print(quot;df1:quot;)print(df1)print(quot;\ndf2:quot;)print(df2)登录后复制核心实现步骤1. 日期列类型转换
在进行任何日期相关的操作之前,确保所有日期列都被正确地识别为 Pandas 的日期时间类型至关重要。
这可以避免潜在的类型不匹配错误,并允许使用日期时间特有的功能。df1['start date'] = pd.to_datetime(df1['start date'])df1['end date'] = pd.to_datetime(df1['end date'])df2['DATE'] = pd.to_datetime(df2['DATE'])print(quot;\ndf1 (数据转换后):quot;)print(df1)print(quot;\ndf2 (数据转换后):quot;)print(df2)登录后复制2. 数据仓库与条件合并
为了将 df2 中的数据与 df1 中的日期范围进行匹配,我们需要将 df2 从宽格式(每列代表一个公司)转换为长格式(一列代表公司,另一列代表其值)。melt 函数非常适合这个任务。
基于Web3.0的元宇宙,中心化的互联网,深度、沉浸式元宇宙直播平台,用数字化重新定义直播62查看详情
接下来,我们将使用pd.merge_asof进行近似合并。merge_asof是一种特殊的合并,它在左DataFrame的键值“接近”右DataFrame的键值时进行合并。这对于日期范围查找非常有用。df2.melt('DATE', var_name='company'):将df2转换为长格式,DATE列保持不变,其他列名(公司名称)等于company列的值,对应的数据同样value列的值。.sort_values('DATE'):merge_asof要求两个DataFrame都按合并键排序。这里我们按DATE排序。df1.sort_values('开始日期'):,df1也需要按其合并键开始date排序。pd.merge_asof(..., by='company', left_on='DATE', right_on='start date'):by='company':指定在合并时,对于每个公司,独立进行DATE和start日期的近似匹配。left_on='DATE':df2(长格式)中用于匹配的日期列。right_on='start date':df1中用于匹配的起始日期列。merge_asof将找到df1中起始日期小于或等于df2中DATE的最近一行进行合并。
不过,merge_asof只处理了起始日期条件。我们还需要保证合并后的数据在结束日期范围内。这通过 .assign(value=tmp['value'].where(tmp['DATE'].le(tmp['end date']))) 来实现。where 方法会根据条件保留值,否则替换为NaN。
最后,使用pivot将数据从长格式重新转换回所需的宽格式,并清理列名。
# 将df2转换为长格式,并按日期排序tmp = df2.melt('DATE', var_name='company').sort_values('DATE')# 将df1按起始日期排序df1_sorted = df1.sort_values('start date')# 进行merge_asofmerge,基于公司和起始日期# merge_asof 会在df1中找到每个公司的起始日期lt;= tmp['DATE']的最近一行进行merge_df = pd.merge_asof(tmp, df1_sorted, by='company', left_on='DATE', right_on='start date')#应用日期结束条件:如果当前日期(merged_df['DATE'])超出结束日期(merged_df['end date']),则将值设置为NaNfinal_df = merged_df.assign(value=merged_df['value'].where(merged_df['DATE'].le(merged_df['end date'])))#数据将透视回宽格式,以DATE为索引,company为列名,value为值df3 = Final_df.pivot(index='DATE',columns='company',values='value')#清理列名和索引df3 = df3.rename_axis(columns=None).reset_index()print(quot;\ndf3 (最终结果):quot;)print(df3)登录后复制完整示例代码import pandas as pd# 1.数据初始化data1 = { 'company': ['a', 'b', 'c', 'd'], '开始日期': ['2023-01-02', '2023-01-05', '2023-01-04', '2023-01-03'], '结束日期': ['2023-01-06', '2023-01-12', '2023-01-13', '2023-01-10']}df1 = pd.DataFrame(data1)data2 = { '日期': ['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13'], 'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'b': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 'c': [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], 'd': [40, 41, 42, 43, 44, 45, 46,
47, 48, 49]}df2 = pd.DataFrame(data2)print(quot;原始 df1:quot;)print(df1)print(quot;\n 原始 df2:quot;)print(df2)# 2. 数据列类型转换 df1['开始日期'] = pd.to_datetime(df1['开始日期'])df1['结束日期'] = pd.to_datetime(df1['end date'])df2['DATE'] = pd.to_datetime(df2['DATE'])# 3.数据排序与条件合并#将df2转换为长格式,并按日期排序,为merge_asof做准备tmp = df2.melt('DATE', var_name='company', value_name='value_from_df2').sort_values('DATE')# 将df1按起始日期排序,也为merge_asof做准备df1_sorted = df1.sort_values('start date')#使用merge_asof进行近似合并# by='company'确保每个公司独立匹配# left_on='DATE'是tmp中的日期,right_on='start date'是df1_sorted中的起始日期merged_df = pd.merge_asof(tmp, df1_sorted, by='company', left_on='DATE', right_on='开始日期')#应用结束日期条件:如果当前日期超出结束日期,则将值设为NaN#这里的value_from_df2是df2中原始的值final_df = merged_df.assign( value_filtered=merged_df['value_from_df2'].where( (merged_df['DATE'] gt;= merged_df['开始日期']) amp; (merged_df['DATE'] lt;= merged_df['结束日期']) ))# 将数据透视回宽格式df3 = Final_df.pivot(index='DATE', columns='company', value='value_filtered')# 清理列名和索引df3 = df3.rename_axis(columns=None).reset_index()print(quot;\n最终结果 df3:quot;)print(df3)登录后复制注意事项与总结数据类型转换:这是最关键的步骤。不正确的数据类型会导致合并失败或结果不准确。数据排序:pd.merge_asof 要求用于合并的键(left_on 和) right_on)在两个DataFrame中都必须是升序排列的。merge_asof的行为:merge_asof默认会找到right_on列中小于或等于left_on列的最近一个值进行合并。
它只是开始日期条件,因此额外的条件来检查结束日期。通过参数:在有多个分组(如本例中的公司)时,使用参数确保在每个分组内部方便独立进行判断合并,这对于维护数据的逻辑缺陷处理至关重要。melt 和 hub:需要两个函数在处理宽格式和长格式数据时非常强大,是解决此类问题的常用组合。melt 将数据“前面”起来,进行逐行操作或合并;pivot则将其“展开”回所需的表格形式。性能:对于非常大的数据集,melt和pivot操作可能会占用预设内存和计算资源。但在大多数常见情况下,这种高效方法是且判断性很强的。
通过上述步骤,我们能够有效地根据复杂的日期范围条件,从一个DataFrame中取出并填充数据到另一个DataFrame中,从而满足数据的处理需求。
以上就是使用Pandas基于日期范围条件填充DataFrame数据的详细内容,更多请关注乐哥常识网其他相关!日期堆类型转换数据分析 大家都看:Excel表格怎么清除重复数据_Excel表格快速清除重复项功能 Node.js异步实践:解决https.get回调中数据更新不同步问题 vivo器收藏夹里的网址浏览怎么排序_vivo浏览器收藏夹网址排序管理的方法 Python数据清洗:利用正则精准去除特定分隔符行怎么优化HTML在线搜索引擎排名_HTML在线搜索引擎排名优化与SEO方案
