【问题标题】:Merging two dataframes with different structure using pandas使用 pandas 合并具有不同结构的两个数据框
【发布时间】:2019-12-16 05:40:49
【问题描述】:

我需要将数据从一个数据帧合并到另一个数据帧。 主要数据框由带有年份、月份和地区变量的调查答案组成。 我需要合并的数据是该特定月份的天气数据。该数据存储在我的第二个气象站数据框中,具有年份变量、每个月的温度平均变量(例如 value1、value2、... value12)和区域变量。

我尝试合并区域和年份的两个数据框,然后我的计划是选择与调查一致的平均温度变量。

df1
---------------------------
year  month     regions
2002  january   Pais Vasco
2002  february  Pais Vasco 
2003  march     Pais Vasco 
2002  november  Florida
2003  december  Florida
...   ...      ...
---------------------------

df2
-----------------------------------------------
year  value1  value2  ...  value12  regions
2002  10      11      ...  9        Pais Vasco
2003  11      11      ...  10       Pais Vasco
2004  12      11      ...  10       Pais Vasco
2002  11      11      ...  9        Florida
2003  10      11      ...  9        Florida
-----------------------------------------------

所以在这个例子中,我需要在我的第一次调查观察中从 Pais Vasco 地区和 2002 年获取相应的温度(value1)数据。

当我试图合并时

df_merged = pd.merge(df1, df2, how = "left", on =["regions", "year"])

我只是得到一个数据框,其观察结果比我原来的调查数据框要多。

【问题讨论】:

  • 'month' in df2.columns?还是以宽格式存储为 value1、value2 等?
  • 您在regions 上合并,但该列名为region。是不是打错字了?
  • 这两个表是否 1:1 匹配?每个地区/年份组合应该只有一次天气观测。
  • ifly6:df2 中的月份信息以宽格式存储为 value1、value2 等,所以也许将该信息分成两列会有所帮助? Jordan:两个数据框不匹配,每个地区/年份组合只有一个天气观测值。
  • 看看我的回答,你会发现我将valueX 列拆分为月份列,取给定X 的任何值。

标签: python pandas dataframe


【解决方案1】:

我将此数据转换为tidy 格式。假设value1value2等对应valuemonth,则使用pd.wide_to_long将其变成长整齐的格式再合并。

tidy = pd.wide_to_long(df, stubnames=['value'], i=['year', 'region'], j='month', sep='') \
    .reset_index()

您需要标准化您的月份,以便它们都是数字或整数。你如何做到这一点超出了这个答案的范围。

那么,

df1.merge(tidy, on=['year', 'month', 'region'], how='left', validate='1:1')

如果这引发错误,那么您对同一个 ['year', 'month', 'region'] 键有多个观察结果。通过删除重复项来解决这个问题。您如何做到这一点几乎可以肯定很大程度上取决于您的数据。


sobek 注意到您有一个拼写错误,在合并命令中说 'regions' 而不是 'region'。确保您指的是实际存在的列。

【讨论】:

  • 你不能合并字符串列吗?它会弄乱排序,但除此之外?
  • 你的意思是存储月份的形式?它们是什么形式并不重要。
  • 我想我不明白你为什么说需要将月份标准化。
  • df1 中,它们被命名为一月、二月、三月......来自tidy 的输出将有这些月份为[1, 2, 3...]。如果不将其中一个转换为另一个格式,这些将不匹配。
  • 所以我刚刚尝试了你的代码,它让我走到了一半,但是我输入的变量作为索引(i = [...])和后缀(j =“月”)所有最终都作为新索引而不是单独的变量。知道为什么会这样吗?
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2013-03-24
  • 2021-12-18
  • 2018-08-21
相关资源
最近更新 更多