Неожиданные столбцы не совпадают при слиянии Pandas DataFrame - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь объединиться с Pandas DataFrame, как показано ниже:

import numpy as np
import pandas as pd

df = pd.DataFrame({"vals": np.random.RandomState(31).randint(-30, 30, size=15), 
                   "grps": np.random.RandomState(31).choice(["A", "B"], 15)})

mean = df.groupby('grps').mean().rename(columns={'vals':'mean'})
df.merge(df, mean, left_on='grps', right_index=True)

Но я получил эту ошибку:

...
/opt/conda/lib/python3.7/site-packages/pandas/core/reshape/merge.py in _maybe_coerce_merge_keys(self)
   1144                     inferred_right in string_types and inferred_left not in string_types
   1145                 ):
-> 1146                     raise ValueError(msg)
   1147 
   1148             # datetimelikes must match exactly

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

Я думаю, что типы ключа объединения в этих два DataFrame одинаковы. Почему произошла эта ошибка?

2020-05-02 обновление:

@ wwnde указало, что ошибка может быть связана с различными размерами индекса двух DataFrame. Но как объяснить следующий рабочий пример:

df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df2 = pd.DataFrame({'group': ['Accounting', 'Accounting',
                              'Engineering', 'Engineering', 'HR', 'HR'],
                    'skills': ['math', 'spreadsheets', 'coding', 'linux',
                               'spreadsheets', 'organization']})
print(df1)
print(df2)
pd.merge(df1, df2)

I reset_index для mean DataFrame, это новая ошибка:

mean = df.groupby('grps').mean().rename(columns={'vals':'mean'}).reset_index()
df.merge(df, mean, on='grps')

Ошибка:

/opt/conda/lib/python3.7/site-packages/pandas/core/generic.py in __nonzero__(self)
   1477     def __nonzero__(self):
   1478         raise ValueError(
-> 1479             f"The truth value of a {type(self).__name__} is ambiguous. "
   1480             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1481         )

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

IICU

Это может быть лучшим выходом

df['mean']=df.groupby('grps')['vals'].transform('mean')
df

enter image description here

0 голосов
/ 30 апреля 2020

Вместо df.merge(df, mean, left_on='grps', right_index=True), думаю, вам нужно df.merge(mean, left_on='grps', right_index=True)

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