【问题标题】:Debugging pandas index differences调试 pandas 索引差异
【发布时间】:2018-05-18 00:21:03
【问题描述】:

我有两个相同的数据框(唯一的区别是列的名称 - 索引和值匹配)

df1
Out[300]: 
                         C1 2018-05-17 P1 2018-05-17
Symbol YYYY MM DD Strike                            
AA     2018 05 18 29.0               0             0
                  30.0               0             0

df2
Out[301]: 
                         C 2018-05-17 P 2018-05-17
Symbol YYYY MM DD Strike                          
AA     2018 05 18 29.0              0            0
                  30.0              0            0

当我尝试加入它们时,pandas 与索引不匹配

df1.join(df2,how='outer')
Out[302]: 
                       C1 2018-05-17 P1 2018-05-17 C 2018-05-17 P 2018-05-17
Symbol YYYY MM DD Strike                                                      

AA     2018 05 18 29.0               0             0          NaN          NaN
                  30.0               0             0          NaN          NaN
                  29.0             NaN           NaN            0            0
                  30.0             NaN           NaN            0            0

似乎“罢工”没有被识别为匹配。我怎样才能找出这里的区别?

df1.info()
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 2 entries, (AA, 2018, 05, 18, 29.0) to (AA, 2018, 05, 18, 30.0)
Data columns (total 2 columns):
C1 2018-05-17    2 non-null object
P1 2018-05-17    2 non-null object
dtypes: object(2)
memory usage: 48.3+ KB

df2.info()
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 2 entries, (AA, 2018, 05, 18, 29.0) to (AA, 2018, 05, 18, 30.0)
Data columns (total 2 columns):
C 2018-05-17    2 non-null object
P 2018-05-17    2 non-null object
dtypes: object(2)
memory usage: 7.5+ KB

更新:

我发现 Strike 列之一是 float 类型

df1 = df1.reset_index()

df2 = df2.reset_index()

df1.dtypes
Out[346]: 
Symbol            object
YYYY              object
MM                object
DD                object
Strike           float64
C1 2018-05-17     object
P1 2018-05-17     object
dtype: object

df2.dtypes
Out[347]: 
Symbol          object
YYYY            object
MM              object
DD              object
Strike          object
C 2018-05-17    object
P 2018-05-17    object
dtype: object

但是,即使我将 dtype 更改为 object

df1 = df1.reset_index()

df1.Strike = df1.Strike.astype('object')

df1.dtypes
Out[360]: 
level_0           int64
index            object
Symbol           object
YYYY             object
MM               object
DD               object
Strike           object
C1 2018-05-17    object
P1 2018-05-17    object
dtype: object

如果我将它设置回索引,它会变回浮动

df1.set_index(['Symbol','YYYY','MM','DD','Strike']).reset_index().dtypes
Out[373]: 
Symbol            object
YYYY              object
MM                object
DD                object
Strike           float64
C1 2018-05-17     object
P1 2018-05-17     object
dtype: object

如何阻止它变回来?

【问题讨论】:

    标签: python pandas join


    【解决方案1】:

    这是一个糟糕的答案,但它有效 - 不知道为什么

    如果我将数据框放在一个csv中然后读取它,我可以成功设置数据类型

    df1.to_csv(r'*.csv')
    df1 = pd.read_csv(r'*.csv', dtype = 'str')
    df1 = df1.set_index(['Symbol','YYYY','MM','DD','Strike'])
    

    【讨论】:

      【解决方案2】:

      如果我对一组使用字符串,对另一组使用 int,我可以重新创建您的问题。我的猜测是 Strike 列的类型不同:

      tuples1 = [('AA', '2018', '05', '18', '29'), ('AA', '2018', '05', '18', '30')]
      index1 = pd.MultiIndex.from_tuples(tuples1, names=('Symbol', 'YYYY', 'MM', 'DD', 'Strike'))
      
      tuples2 = [('AA', '2018', '05', '18', 29), ('AA', '2018', '05', '18', 30)]
      index2 = pd.MultiIndex.from_tuples(tuples2, names=('Symbol', 'YYYY', 'MM', 'DD', 'Strike'))
      
      df1 = pd.DataFrame(np.random.rand(2,2), index=index1, columns=['A','B'])
      df2 = pd.DataFrame(np.random.rand(2, 2), index=index2, columns=['C', 'D'])
      
      print(df1)
      print(df2)
      
      print(df1.join(df2, how='outer'))
      

      输出:

                                       A         B         C         D
      Symbol YYYY MM DD Strike                                        
      AA     2018 05 18 29      0.891830  0.670130       NaN       NaN
                        30      0.126326  0.921279       NaN       NaN
                        29           NaN       NaN  0.962292  0.822756
                        30           NaN       NaN  0.478753  0.559231
      

      如果你尝试:

      print(index1.get_level_values(4))
      print(index2.get_level_values(4))
      

      然后你会看到它们有不同的数据类型:

      Index(['29', '30'], dtype='object', name='Strike')
      Int64Index([29, 30], dtype='int64', name='Strike')
      

      如果你这样做了

      df1.Strike = df1.Strike.astype('object')
      

      然后你得到:

      Symbol     object
      YYYY       object
      MM         object
      DD         object
      Strike    float64
      C         float64
      D         float64
      

      改为

      df1.Strike = df1.Strike.astype(str)
      

      这给了:

      Symbol     object
      YYYY       object
      MM         object
      DD         object
      Strike     object
      C         float64
      D         float64
      

      最后:

      print(df1.join(df2, how='outer'))
      

      输出:

                                       A         B         C         D
      Symbol YYYY MM DD Strike                                        
      AA     2018 05 18 29      0.755093  0.256132  0.291880  0.404898
                        30      0.827709  0.254511  0.849849  0.605643
      

      当然,如果您最终将字符串 '30' 与字符串 '30.0' 进行比较,这将不起作用,因此最好将字符串更改为浮动而不是相反。

      【讨论】:

      • 嗨特洛伊,请查看我的问题中的更新。您的观点是正确的,但我没有成功更改数据类型
      • 尝试:df1.Strike = df1.Strike.astype(str)
      猜你喜欢
      • 2015-10-11
      • 1970-01-01
      • 2020-08-09
      • 2016-09-08
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2012-05-12
      相关资源
      最近更新 更多