使用isin()函数匹配DateTime并合并两个Pandas DataFrame的技术问题求助
解决方法:用Merge合并匹配的列
嘿,我明白你的需求啦——你想把da里存在的DateTime对应的df中的Column1、Column2、Column3合并到da里。你的思路方向是对的,但用isin()之后直接索引df的方式有问题,因为两个数据框的行数不一样,会导致索引不匹配的错误。
问题出在哪?
你生成的filter1是长度为9的布尔数组(对应da的行数),但df有13行,用df.loc[filter1]的时候,布尔数组的长度和df的行数不匹配,会直接报错:ValueError: Boolean array expected for the condition, not int。而且就算不报错,也没法准确把对应的数据映射到da的行上。
正确的做法:用pd.merge()
Pandas的merge()方法就是专门用来做这种基于共同列合并数据框的操作,比isin()更直接高效。你只需要把da作为左表,df作为右表,以DateTime为匹配键,选择left连接方式(保证da的所有行都保留),然后指定要合并的列即可。
修正后的完整代码
import pandas as pd # 构建da数据框 da = pd.DataFrame() da['Date'] = ["29/07/2021", "29/07/2021", "30/07/2021", "30/07/2021", "31/07/2021", "31/07/2021", "01/08/2021", "01/08/2021", "02/08/2021"] da['Time'] = ["06:48:00", "06:59:00", "07:14:00", "08:12:00", "08:42:00", "08:57:00", "05:45:00", "05:55:00", "06:05:00"] da['DateTime'] = pd.to_datetime(da.pop('Date')) + pd.to_timedelta(da.pop('Time')) da['DateTime'] = da['DateTime'].dt.strftime('%Y-%m-%d %H:%M') # 构建df数据框 df = pd.DataFrame() df['Date'] = ["29/07/2021", "29/07/2021", "29/07/2021", "29/07/2021", "30/07/2021", "30/07/2021", "30/07/2021", "30/07/2021", "31/07/2021", "31/07/2021", "01/08/2021", "01/08/2021", "02/08/2021"] df['Time'] = ["06:48:00", "06:53:00", "06:56:00", "06:59:00", "07:14:00", "07:18:00", "07:40:00", "08:12:00", "08:42:00", "08:57:00", "05:45:00", "05:55:00", "06:05:00"] df["Column1"] = [0.011534891, 0.013458399, 0.017792937, 0.018807581, 0.025931434, 0.025163517, 0.026561283, 0.027743659, 0.028854, 0.000383506, 0.000543031, 0.000342, 0.000313769] df["Column2"] = [8.4021, 8.4421, 8.4993, 8.545, 8.3627, 8.5518, 8.6266, 8.6455, 8.485, 8.545, 8.415, 8.475, 8.505] df["Column3"] = [0.000270475, 0.000313769, 0.000383506, 0.000414331, 0.000533619, 0.000505081, 0.000533131, 0.000543031, 0.000342, 0.011534891, 0.013458399, 0.025931434, 0.025163517] df['DateTime'] = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Time')) df['DateTime'] = df['DateTime'].dt.strftime('%Y-%m-%d %H:%M') # 合并数据框:保留da的所有行,匹配df中对应DateTime的Column1-3 da_merged = pd.merge(da, df[['DateTime', 'Column1', 'Column2', 'Column3']], on='DateTime', how='left') # 查看结果 print(da_merged.head(10))
结果说明
运行这段代码后,da_merged会包含da原来的DateTime列,以及匹配到的Column1、Column2、Column3的值。因为你的da里的所有DateTime都能在df中找到,所以不会出现NaN值。如果以后有da里的DateTime在df中不存在的情况,对应的列会填充为NaN,这也是how='left'的优势——不会丢失da的任何行。
内容的提问来源于stack exchange,提问作者HamidRouji
相关产品推荐
相关产品推荐

