Отладка различий в индексах панд - PullRequest
0 голосов
/ 17 мая 2018

У меня есть два идентичных кадра данных (единственное отличие - это имя столбцов - индекс и значения совпадают)

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 на объект

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

Если я верну его обратно в индекс, он изменится на float

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

Как мне остановить его возврат обратно?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Это плохой ответ, но он работает - не уверен, почему

Если я помещаю фрейм данных в csv, а затем читаю его, я могу успешно установить типы данных

df1.to_csv(r'*.csv')
df1 = pd.read_csv(r'*.csv', dtype = 'str')
df1 = df1.set_index(['Symbol','YYYY','MM','DD','Strike'])
0 голосов
/ 17 мая 2018

Я могу воссоздать вашу проблему, если я использую строку для одного набора и 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», поэтому может быть лучше изменить строку на float, а не наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...