【问题标题】:Joining 2 datasets in pandas在 pandas 中加入 2 个数据集
【发布时间】:2018-05-21 11:40:49
【问题描述】:

大家好, 我无法在 Pandas 中加入 2 个数据集。第一个包含在一年中的设定月份每种类型的房屋出售了多少,第二个包含每种类型的房屋每年建造了多少。我试图将每行显示的 2 结合起来:年份、房屋类型、12 个月内的平均价格以及当年建造了多少此类房屋。一个问题是年份显示在第一个数据集中的行和第二个数据集中的列中,我不知道如何处理。另一个问题是试图获得 12 个月的平均价格。我在最后添加了一个包含平均价格的列,但其中也包括了年份,这并不好。此外,不确定如何仅获得平均价格,而不将每个月都添加到数据集中。 任何建议表示赞赏,谢谢。

数据集 1 包含已售房屋:

Year type          Jan     Feb    Mar ... Dec
2016  Oakham       160000  165000
2016  Alvingham    155000  150000
2017  Oakham
2017  Alvingham

数据集 2 包含已建成的房屋:

               2015    2016    2017
Oakham          150     200     250
Alvingham        50      85
Chesam

预期的输出会是这样的:

YEAR    TYPE       AVERAGE PRICE       AMOUNT BUILT
2016    Oakham            175500                200
2017    Chesam            325000                 20

【问题讨论】:

  • 请添加预期输出

标签: pandas


【解决方案1】:

这里有一个解决方案:

df1:

      Feb     Jan  Year       type
0  165000  160000  2016     Oakham
1  155000  150000  2016  Alvingham
2  165000  165000  2017     Oakham
3  165000  160000  2017  Alvingham

df2:

           2015  2016  2017
Oakham      150   200   250
Alvingham    50    85    80

首先,您只需计算价格列的平均数:

df1['avg'] = df1.drop(['type', 'Year'], axis=1).mean(axis=1) print(df1)

      Feb     Jan  Year       type       avg
0  165000  160000  2016     Oakham  162500.0
1  155000  150000  2016  Alvingham  152500.0
2  165000  165000  2017     Oakham  165000.0
3  165000  160000  2017  Alvingham  162500.0

现在您只需将 df1 与未堆叠版本的 df2 合并:

df3 = pd.merge(left=df1[['type', 'Year', 'avg']],
               right=df2.unstack().reset_index(),
               left_on=['type', 'Year'],
               right_on=['level_1','level_0'])

print(df3) 的输出为:

        type  Year       avg  level_0    level_1    0
0     Oakham  2016  162500.0     2016     Oakham  200
1  Alvingham  2016  152500.0     2016  Alvingham   85
2     Oakham  2017  165000.0     2017     Oakham  250
3  Alvingham  2017  162500.0     2017  Alvingham   80

然后您可以删除不需要的列并重命名其他列:

print(df3.drop(['level_0', 'level_1'],
                axis=1).rename(columns={0: 'AMOUNT BUILT',
                                        'avg': 'AVERAGE PRICE'}))

结果是:

        type  Year  AVERAGE PRICE  AMOUNT BUILT
0     Oakham  2016       162500.0           200
1  Alvingham  2016       152500.0            85
2     Oakham  2017       165000.0           250
3  Alvingham  2017       162500.0            80

【讨论】:

  • 感谢您的回复。我现在明白如何解决问题了。但是,当我尝试计算平均房价时,它只是返回为 NaN。除非我不删除年份和类型,在这种情况下,平均值仅显示为年份 (2016.0)
  • 已解决。一些列是对象,这就是 .mean 无法识别它们的原因。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 2016-10-11
  • 2023-04-05
相关资源
最近更新 更多