我正在尝试将两个数据帧合并在一起。具有讽刺意味的是,他们最初是作为同一数据框架的一部分开始的,但我正在制定婴儿步骤 - 有时是在错误的方向。 第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类型,但我没有合并它们 - 我认为只要索引排队,合并应该有效吗?我做错了什么?
答案 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')
merge
和join
将返回: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')
现在join
和merge
将起作用:
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()
希望这有帮助