我在数据框old_df
中有一个Excel文件,通过从另一个Excel文件数据框new_df
中添加新的内容,可以使数据保持最新。如果新数据帧中的日期之一在旧数据帧中不存在,我只是pd.concat
将新数据帧和旧数据帧一起使用。
当前该文件中的一些重要列为:
Pub Date Forecast Time Forecast Date State Temp
2018-12-12 23:00:00 2018-12-20 AK 3
2018-12-12 02:00:00 2018-12-20 AK 3.2
2018-12-12 05:00:00 2018-12-20 AK 2.9
.
.
我想确保在使用新数据更新此旧文件时传递重复的行-用Pub Date
,Forecast Time
和{{1跳过Forecast Date
的非唯一实例}}。
现在,对于新旧版本,我使用State
列表来实现此目的:
Pub Dates
但这会遇到问题,因为如果我添加任何一种相同的dateList_old = date_old.tolist()
dateList_new = date_new.tolist()
result = any(elm in dateList_new for elm in dateList_old)
if result == True:
print('One or more of the dates already exists in the database')
sys.exit()
else:
frames = [old_df,new_df]
result = pd.concat(frames)
result.to_excel("file", encoding="utf-8", index=False)
-它将退出整个写入。
我想这样做,以便如果Pub Date
在Pub Date + Forecast Time + Forecast Date + State
中,则跳过并继续写入所有其他不存在的行,并仅在所有这些组合都已经存在的情况下退出存在。
有一种简单的方法吗?
答案 0 :(得分:2)
您还可以使用:
df.append(df1,ignore_index=True).drop_duplicates(subset=['Pub Date','Forecast Time','Forecast Date','State'])
将两个数据框视为:
df
:
Pub Date Forecast Time Forecast Date State Temp
0 2018-12-12 23:00:00 2018-12-20 AK 3.0
1 2018-12-12 02:00:00 2018-12-20 AK 3.2
2 2018-12-12 05:00:00 2018-12-20 AK 2.9
df1
:
Pub Date Forecast Time Forecast Date State Temp
0 2018-12-12 23:00:00 2018-12-20 AK 3.0
1 2018-12-13 02:00:00 2018-12-20 AK 3.2
2 2018-12-13 05:00:00 2018-12-20 AK 2.9
df.append(df1,ignore_index=True).drop_duplicates(subset=['Pub Date','Forecast Time','Forecast Date','State'])
Pub Date Forecast Time Forecast Date State Temp
0 2018-12-12 23:00:00 2018-12-20 AK 3.0
1 2018-12-12 02:00:00 2018-12-20 AK 3.2
2 2018-12-12 05:00:00 2018-12-20 AK 2.9
4 2018-12-13 02:00:00 2018-12-20 AK 3.2
5 2018-12-13 05:00:00 2018-12-20 AK 2.9
基本上同时添加数据框和仅基于['Pub Date','Forecast Time','Forecast Date','State']
的某些列删除重复项
答案 1 :(得分:0)
总结一下您的问题:您有两个数据框(“旧”和“新”),并且想要连接“新”中“旧”中不存在的行(基于发布日期,预测时间,等等。)。是吗?
您可以进行逻辑索引。例如,标识在两个数据框中都满足所有条件的行。
let crypto = EasyCrypt(secret: "mySecretKey", algorithm: .sha256)
let result = crypto.hash("This is very secret text to encrypt")
let otherResult = crypto.hash("This is another secret text to encrypt")
print("result: ", result)
print("otherResult: ", otherResult)