【问题标题】:ValueError: can only call with other PeriodIndex-ed objectsValueError:只能与其他 PeriodIndex-ed 对象一起调用
【发布时间】:2017-03-22 20:06:03
【问题描述】:

我正在尝试将 2 个数据框合并在一起。具有讽刺意味的是,它们一开始是同一个数据框的一部分,但我正在迈出小步——有时方向是错误的。 第 1 帧如下所示:

Int64Index:10730 个条目,0 到 10729 数据列(共6列): RegionID 10730 非空 int64 RegionName 10730 非空对象 状态 10730 非空对象 Metro 10259 非空对象 CountyName 10730 非空对象 SizeRank 10730 非空 int64 数据类型:int64(2),对象(4)

第 2 帧如下所示:

Int64Index:10730 个条目,0 到 10729 数据列(共82列): 1996Q2 8218 非空 float64 1996Q3 8229 非空 float64 1996Q4 8235 非空 float64 ...... 2016Q1 10730 非空 float64 2016Q2 10730 非空 float64 2016Q3 10730 非空 float64 数据类型:float64(82)

请注意,索引的类型相同,它们甚至具有相同的行数。
我正在尝试像这样将数据框合并在一起:

df4 = pd.merge(df3, df2, how='inner', left_index=True, right_index=True)

我得到的错误是:

ValueError: can only call with other PeriodIndex-ed objects

第二个数据框中的 2016Q1 和类似名称的列属于 Period 类型,但我没有合并它们——我认为只要索引对齐,合并就可以工作吗?我做错了什么?

【问题讨论】:

  • 您能否发布两帧数据的缩减样本 (mvce)?我认为您的代码绝对没有问题(也就是说,如果 df3 和 df2 确实是第 1 帧和第 2 帧)

标签: python pandas join dataframe


【解决方案1】:

假设我们有以下 DF:

In [44]: df1
Out[44]:
   1996Q2  2000Q3    2010Q4
0     1.5     3.5  1.000000
1    22.0    38.5  2.000000
2    15.0    35.0  4.333333

In [45]: df1.columns
Out[45]: PeriodIndex(['1996Q2', '2000Q3', '2010Q4'], dtype='period[Q-DEC]', freq='Q-DEC')

注意:df1.columns 属于 PeriodIndex dtype

In [46]: df2
Out[46]:
    a   b   c
0  a1  b1  c1
1  a2  b2  c2
2  a3  b3  c3

In [47]: df2.columns
Out[47]: Index(['a', 'b', 'c'], dtype='object')

mergejoin 将返回:ValueError: can only call with other PeriodIndex-ed objects,因为,AFAIK,如果其中一些属于 PeriodIndex dtype,则 Pandas DF 不能有混合列 dtype:

In [48]: df1.join(df2)
...
skipped
...
ValueError: can only call with other PeriodIndex-ed objects

merge 抛出同样的异常:

In [54]: pd.merge(df1, df2, left_index=True, right_index=True)
...
skipped
...
ValueError: can only call with other PeriodIndex-ed objects

所以我们必须将df1.columns 转换为字符串:

In [49]: df1.columns = df1.columns.values.astype(str)

In [50]: df1.columns
Out[50]: Index(['1996Q2', '2000Q3', '2010Q4'], dtype='object')

现在joinmerge 可以工作了:

In [51]: df1.join(df2)
Out[51]:
   1996Q2  2000Q3    2010Q4   a   b   c
0     1.5     3.5  1.000000  a1  b1  c1
1    22.0    38.5  2.000000  a2  b2  c2
2    15.0    35.0  4.333333  a3  b3  c3

In [52]: pd.merge(df1, df2, left_index=True, right_index=True)
Out[52]:
   1996Q2  2000Q3    2010Q4   a   b   c
0     1.5     3.5  1.000000  a1  b1  c1
1    22.0    38.5  2.000000  a2  b2  c2
2    15.0    35.0  4.333333  a3  b3  c3

用于合并 DF 的列 dtypes

In [58]: df1.join(df2).columns
Out[58]: Index(['1996Q2', '2000Q3', '2010Q4', 'a', 'b', 'c'], dtype='object')

如果您在合并完成后需要 df1.columnsPeriodIndex - 您可以在转换之前保存 df1.columns 并在完成合并/加入后将它们重新设置:

In [60]: df1.columns
Out[60]: PeriodIndex(['1996Q2', '2000Q3', '2010Q4'], dtype='period[Q-DEC]', freq='Q-DEC')

In [61]: cols_saved = df1.columns

In [62]: df1.columns = df1.columns.values.astype(str)

In [63]: df1.columns
Out[63]: Index(['1996Q2', '2000Q3', '2010Q4'], dtype='object')

# merging (joining) or doing smth else here ...

In [64]: df1.columns = cols_saved

In [65]: df1.columns
Out[65]: PeriodIndex(['1996Q2', '2000Q3', '2010Q4'], dtype='period[Q-DEC]', freq='Q-DEC')

【讨论】:

  • 我了解您在做什么以及您将在哪里进行此操作,但是,对我来说,字符串转换的工作方式不同。当我按照您的建议执行此“astype”时,我得到了 Index(['105', '106', '107' ...... ], dftype='object')
  • @alernerdev,你的熊猫版本是什么?我正在使用熊猫 0.19.1
  • 它的 0.18.1 -- 你认为它会有所作为吗?
  • @alernerdev,如果可以的话,我认为更新到 0.19.1 是有意义的 - 有很多新功能和错误修复......
【解决方案2】:

我实际上遇到了同样的问题,并且也得到了整数列。

代替

df1.columns = df1.columns.values.astype(str)

我用过

df1.columns = df1.columns.format()

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多