将数据帧中的数据与字典中的数据合并

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。因为这两个对象不是strintfloat 等,Python 尝试比较两者的bool。当您尝试获取 pandas.Seriesbool 时会引发此异常。

您可以使用 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中循环遍历数据框字典并将字典中的每个数据框与单个数据框合并

spark:合并两个数据帧,如果两个数据帧中的ID重复,则df1中的行覆盖df2中的行

合并一个值在另外两个之间的熊猫数据框[重复]

如何将字典附加到熊猫数据框?