ValueError:只能与其他PeriodIndex编辑的对象

时间:2016-11-09 03:16:46

标签: python pandas join dataframe

我正在尝试将两个数据帧合并在一起。具有讽刺意味的是,他们最初是作为同一数据框架的一部分开始的,但我正在制定婴儿步骤 - 有时是在错误的方向。 第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 :(得分: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如果其中一些是PeriodIndex dtype,则不能有混合列dtypes :

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')

答案 1 :(得分:0)

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

而不是

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

我用过

df1.columns = df1.columns.format()

希望这有帮助