首页 文章

ValueError:只能与其他PeriodIndex-ed对象一起调用

提问于
浏览
3

我试图将2个数据帧合并在一起 . 具有讽刺意味的是,他们最初是作为同一数据框架的一部分开始的,但我正在制定婴儿步骤 - 有时是在错误的方向 . 第1帧看起来像这样:

Int64Index: 10730 entries, 0 to 10729
Data columns (total 6 columns):
RegionID      10730 non-null int64
RegionName    10730 non-null object
State         10730 non-null object
Metro         10259 non-null object
CountyName    10730 non-null object
SizeRank      10730 non-null int64
dtypes: int64(2), object(4)

第2帧看起来像这样:

Int64Index: 10730 entries, 0 to 10729
Data columns (total 82 columns):
1996Q2    8218 non-null float64
1996Q3    8229 non-null float64
1996Q4    8235 non-null float64
.....
2016Q1    10730 non-null float64
2016Q2    10730 non-null float64
2016Q3    10730 non-null float64
dtypes: 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类型,但我没有合并它们 - 我认为只要索引排成一行,合并应该有效吗?我究竟做错了什么?

2 回答

  • 0

    假设我们有以下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 as,AFAIK,Pandas DF不能有混合列dtypes,如果其中一些是 PeriodIndex 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.columns 作为 PeriodIndex - 您可以在转换它们之前保存 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')
    
  • 0

    我实际上有同样的问题,并获得整数列 .

    代替

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

    我用了

    df1.columns = df1.columns.format()
    

    希望这可以帮助

相关问题