ValueError: Вы пытаетесь объединить столбцы объекта и float64. Если вы продолжаете sh, вы должны использовать pd.concat - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу найти частоту FRAUD для всех функций в отдельности, а затем заменить эти значения значением функции. Например, мой пример данных приведен ниже, затем я хочу найти коэффициент мошенничества моей модели, например STEP1, затем я хочу заменить его значением модели, например STEP2.

enter image description here

Мой код ниже, чтобы найти эти значения, но он не работает. Код ошибки также ниже. Может ли кто-нибудь мне помочь?

for i in df2_a.columns:
    grp1 = df2.groupby(i, as_index=False, sort=True, group_keys=True)[['EXT_REFERENCE']].count()
    df3 = df2[df2.FRAUD == 0]
    grp2 = df3.groupby(i, as_index=False, sort=True, group_keys=True)[['EXT_REFERENCE']].count()
    df4 = df2[df2.FRAUD == 1]
    grp3 = df4.groupby(i, as_index=False, sort=True, group_keys=True)[['EXT_REFERENCE']].count()
    grp4 = grp1.merge(grp2, how = 'left', on=i )
    grp5 = grp4.merge(grp3, how = 'left', on=i )
    grp6 = grp5.fillna(0)
    grp6[i+'_New'] = grp5.EXT_REFERENCE / grp5.EXT_REFERENCE_x
    grp7 = grp6.fillna(0)
    grp8 = grp7.drop(['EXT_REFERENCE','EXT_REFERENCE_x','EXT_REFERENCE_y'],axis=1)
    df5 = pd.merge(df2_a, grp8, on=i, how='left')


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-39-225543878353> in <module>
  6     grp3 = df4.groupby(i, as_index=False, sort=True, group_keys=True)[['EXT_REFERENCE']].count()
  7     grp4 = grp1.merge(grp2, how = 'left', on=i )
----> 8     grp5 = grp4.merge(grp3, how = 'left', on=i )
  9     grp6 = grp5.fillna(0)
 10     grp6[i+'_New'] = grp5.EXT_REFERENCE / grp5.EXT_REFERENCE_x

/opt/anaconda/envs/env_python/lib/python3.6/site-packages/pandas/core/frame.py in merge(self, right, 
how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)
6866                      right_on=right_on, left_index=left_index,
6867                      right_index=right_index, sort=sort, suffixes=suffixes,
-> 6868                      copy=copy, indicator=indicator, validate=validate)
6869 
6870     def round(self, decimals=0, *args, **kwargs):

/opt/anaconda/envs/env_python/lib/python3.6/site-packages/pandas/core/reshape/merge.py in merge(left, 
right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, 
validate)
 45                          right_index=right_index, sort=sort, suffixes=suffixes,
 46                          copy=copy, indicator=indicator,
 ---> 47                          validate=validate)
 48     return op.get_result()
 49 

/opt/anaconda/envs/env_python/lib/python3.6/site-packages/pandas/core/reshape/merge.py in 
__init__(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, 
suffixes, copy, indicator, validate)
531         # validate the merge keys dtypes. We may need to coerce
532         # to avoid incompat dtypes
--> 533         self._maybe_coerce_merge_keys()
534 
535         # If argument passed to validate,

/opt/anaconda/envs/env_python/lib/python3.6/site-packages/pandas/core/reshape/merge.py in 
_maybe_coerce_merge_keys(self)
978                       (inferred_right in string_types and
979                        inferred_left not in string_types)):
--> 980                     raise ValueError(msg)
981 
982             # datetimelikes must match exactly

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

РЕДАКТИРОВАТЬ

Спасибо за ваши комментарии, ребята, но мне интересно, что мой образец имеет только 1 особенность, потому что это пример. Но в моих данных катушки у меня есть 120 функций. Поэтому я пытаюсь с «для l oop» в моем коде для расчета для всех столбцов. Можете ли вы проверить пример ниже и не думайте, что только 2 функции (модель, возраст). Подумайте о 120 характеристиках для того же расчета.

enter image description here

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Я не уверен, что понимаю ваш код, но вот как бы я это сделал:

for col in df.iloc[:, :-1]:
    group_df = df.groupby(col).mean()*100
    df[col] = df[col].map(group_df['Fraud'])

Результат

    Model   Age         Fraud
0   100.0   66.666667   1
1   100.0   33.333333   1
2   0.0     66.666667   0
3   0.0     33.333333   0
4   50.0    66.666667   1
5   50.0    33.333333   0

Предполагается, что столбец Fraud будет последним столбцом

0 голосов
/ 13 февраля 2020

Здесь вы go:

import pandas as pd

df = pd.DataFrame({'Model': ['audi', 'audi', 'bmw', 'bmw', 'ford', 'ford'],'Age':[1,2,1,2,1,2] , 'Fraud': [1,1,0,0,1,0]})

# group df by Age
grouped_age = df.groupby('Age', as_index=False).mean()
merged_df = pd.merge(df, grouped_age, on=['Age'], how='inner')
df = merged_df.rename({'Age': 'x', 'Fraud_x': 'Fraud', 'Fraud_y':'Age'}, axis='columns')
df = df.drop('x', axis=1)

# group df by Model
grouped_df = df.groupby('Model', as_index=False).mean()
merged_df = pd.merge(df, grouped_df, on=['Model'], how='inner')
# some display corrections
df = merged_df.rename({'Model': 'x', 'Fraud_x': 'Fraud', 'Fraud_y':'Model', 'Age_x':'Age'}, axis='columns')
df = df.drop(['x', 'Age_y'], axis=1)
df = df[['Model', 'Age', 'Fraud']]
df['Model'] = df['Model'] * 100
df['Age'] = (df['Age'] * 100).round(0)

Вывод:

   Model   Age  Fraud
0  100.0  67.0      1
1  100.0  33.0      1
2    0.0  67.0      0
3    0.0  33.0      0
4   50.0  67.0      1
5   50.0  33.0      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...