команда python 2 против python 3 pd.merge - PullRequest
0 голосов
/ 18 октября 2018

Следующая команда работает нормально, если я запускаю python 2

df5b = pd.merge(df5a, df5bb, how='outer')

Однако, когда я запускаю ту же команду с теми же dfs в python 3, я получаю следующую ошибку:

ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat

Мои кадры данных очень большие, я надеюсь, что кто-то может мне помочь, не приводя примеров моих кадров данных.Команда в порядке с Python 2, поэтому я предполагаю, что проблема не в кадрах данных, а, возможно, изменение этой команды в Python 3?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Как я уже говорил в разделе комментариев, принудительное использование не происходит в смешанных типах (может быть int, str или float), поэтому вы можете считать concat или преобразовать их как str, а затем объединитькоторый упоминал Джезраэль.

Просто чтобы определить типы, которые вы видите ..

>>> pd.concat([df5a, df5bb]).dtypes
B     object
C    float64
F     object
dtype: object

>>> pd.concat([df5a, df5bb])
   B    C  F
0  4  7.0  a
1  5  8.0  a
2  4  9.0  a
3  5  4.0  b
0  4  NaN  a
1  5  NaN  a
2  5  NaN  b
0 голосов
/ 18 октября 2018

Проблема в том, что некоторые столбцы являются целыми числами в одном DataFrame и строки в другом с одинаковыми именами.

Самое простое решение - привести все столбцы к строкам:

df5b = pd.merge(df5a.astype(str), df5bb.astype(str), how='outer')

Другой тип - это тестовые dtypes:

print (df5a.dtypes)
print (df5bb.dtypes)

И преобразовывать столбцы для одного и того же, например, преобразовывать столбцы строк из списка в целые числа:

cols = ['col1','col12','col3']
df5a[cols] = df5a[cols].astype(int)

Образец :

df5a = pd.DataFrame({
         'B':[4,5,4,5],
         'C':[7,8,9,4],
         'F':list('aaab')
})

df5bb = pd.DataFrame({
         'B':['4','5','5'],
         'F':list('aab')
})

df5b = pd.merge(df5a.astype(str), df5bb.astype(str), how='outer')
print (df5b)

   B  C  F
0  4  7  a
1  4  9  a
2  5  8  a
3  5  4  b

print (df5a.dtypes)
B     int64
C     int64
F    object
dtype: object

print (df5bb.dtypes)
B    object
F    object
dtype: object

cols = ['B']
df5bb[cols] = df5bb[cols].astype(int)

df5b = pd.merge(df5a, df5bb, how='outer')
print (df5b)

   B  C  F
0  4  7  a
1  4  9  a
2  5  8  a
3  5  4  b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...