将数据帧中的数据与字典中的数据合并
Posted
技术标签:
【中文标题】将数据帧中的数据与字典中的数据合并【英文标题】:Merging data from a data frame with data from a dictionary 【发布时间】:2021-12-27 21:16:51 【问题描述】:我有一个字典,键是日期时间,值是那天的数据帧,如下所示:
dict = dt.datetime(2021,11,1):pd.DataFrame('team':['horses','eagles'],
'rating':[15,20]),
dt.datetime(2021,11,2):pd.DataFrame('team':['horses','eagles'],
'rating':[35,50])
datetime.datetime(2021, 11, 1, 0, 0):
team rating
0 horses 15
1 eagles 20,
datetime.datetime(2021, 11, 2, 0, 0):
team rating
0 horses 35
1 eagles 50
我还有一个单独的数据框,其中包含日期时间列和同一行中的这些团队的名称,如下所示:
df = pd.DataFrame('date':[dt.datetime(2021,11,1),dt.datetime(2021,11,2)],
'team_1':'horses',
'team_2':'eagles')
date team_1 team_2
0 2021-11-01 horses eagles
1 2021-11-02 horses eagles
我想做的是遍历字典,以便如果 datetime 键与 df 的日期列中的日期匹配,则从值中获取数据并将其合并到 df 中的团队以创建最终数据框,像这样:
date team_1 team_1_rating team_2 team_2_rating
0 2021-11-01 horses 15 eagles 20
1 2021-11-02 horses 35 eagles 50
我尝试遍历字典并将数据与此代码合并:
for key, value in dict.items:
if key == df['date']:
final_df = pd.merge(df,value,left_on = ['team_1','team_2'], right_on = 'team')
但我收到类似的错误
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我不太确定这是否是一个好方法,但任何帮助将不胜感激!
【问题讨论】:
不要使用dict
,它是Python中的保留关键字。而是使用my_dict
或类似的
建议使用pandas.Timestamp
而不是datetime.datetime
此外,虽然很明显您已尝试提供所有代码,但仍缺少一些内容/这将使尝试帮助您的人更容易。不要将您的代码分成块,因为它很难组合起来以尝试复制错误。还包括您拥有的任何进口商品。有关更多信息,请参阅minimal reproducible example
【参考方案1】:
错误就在这里:
if key == df['date']:
它说它是模棱两可的,因为它确实不知道将它与哪个单元格进行比较。
例如:
x = '2021-11-01'
if x == df['date']:
print ("hola")
它会给你那个错误。
所以,你需要遍历 df.iloc
【讨论】:
我正在检查我的假设;我认为这里可以使用 Python 的if [a] in [b]
构造;是的,错误就在你说的地方,但我不认为循环通过df.iloc
是最好的也不是最pythonic的解决方案。【参考方案2】:
您的问题是if key == df['date']
行没有按照您的想法执行。您正在比较键(它是一个日期时间对象)是否与 df['date']
相同,这是一个 pandas.Series
。因为这两个对象不是str
、int
、float
等,Python 尝试比较两者的bool
。当您尝试获取 pandas.Series
的 bool
时会引发此异常。
您可以使用 for 循环遍历 df['data']
中的每个值,但更简洁的方法是使用 loc
的内置 Pandas 功能(文档 here)。
import datetime as dt
import pandas as pd
import numpy as np
my_dict = dt.datetime(2021,11,1):pd.DataFrame('team':['horses','eagles'],
'rating':[15,20]),
dt.datetime(2021,11,2):pd.DataFrame('team':['horses','eagles'],
'rating':[35,50])
df = pd.DataFrame('date':[dt.datetime(2021,11,1),dt.datetime(2021,11,2)],
'team_1':'horses',
'team_2':'eagles')
# Searching for key match in df
for key, value in my_dict.items():
df.loc[df['date'] == key, 'team_1_rating'] = value['rating'][0]
df.loc[df['date'] == key, 'team_2_rating'] = value['rating'][1]
# Reordering columns to match desired output
col_list = list(df)
col_list[2], col_list[3] = col_list[3], col_list[2]
df.columns = col_list
print(df)
请注意,底部块只是重新排序您的数据框以匹配您所需的输出。
【讨论】:
以上是关于将数据帧中的数据与字典中的数据合并的主要内容,如果未能解决你的问题,请参考以下文章
在python中循环遍历数据框字典并将字典中的每个数据框与单个数据框合并