python - 连接两个 pandas 数据框进行分析
问题描述
我正在尝试解决有关顾客对餐厅偏好的问题。我有两个不同的 CSV,其中一个包含客户信息:
因此,我想尝试基于客户偏好的监督培训,以确定餐厅的评分。为了实现这一点,我认为我必须为每个评级附加客户信息(所以我将有变量要分析)。
我正在尝试使用 python 和 pandas。
我试过这个:
import pandas as pd
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from pandas.plotting import scatter_matrix
import numpy as np
df1 = pd.read_csv('/2_user_profile.csv', index_col = [0])
df2 = pd.read_csv('/3_Ratings.csv')
#Create empty dataframe with named columns
df = pd.DataFrame(columns=(np.concatenate((df2.columns.values, df1.columns.values), axis=0)))
#Joining the tables
for index, row in df2.iterrows():
userID= row['userID']
frame=[row, df1.loc[userID]]
print(frame)
df = pd.concat([df, pd.DataFrame(frame)], axis=0)
print(df)
print(frame) 会给我这个结果:
这是有道理的,但是当我打印 df 它给了我这个:
这意味着我创建的每一帧都会在数据帧上创建一个双重记录,其中一个包含来自 df1 的信息,并且与 df2 上的数据对应的所有值都是空的,另一个寄存器用于 df2 上的所有值和对应于 df1 的空值。
这是我第一次尝试 python+机器学习,所以如果你也对我的方法有意见,请告诉我。
解决方案
看起来你想加入userID
两个数据框,对吧?
您可以使用merge来做到这一点。这是一个简短的例子:
import pandas as pd
data_1 = pd.DataFrame({'id': ['A', 'B'] * 5, 'value_1': [0, 1] * 5})
data_2 = pd.DataFrame({'id': ['A', 'B'], 'value_2': [3, 4]})
data_1.merge(data_2, how = 'inner', left_on = 'id', right_on = 'id')
给出:
推荐阅读
- excel - 针对 Excel 中的下拉列表进行多选和删除
- asp.net-mvc-4 - 如果我们在 UI 上的单列中绑定了两个单独的列值,则不会应用剑道过滤器
- c++ - 无法在结构中包含 circular_buffer
- java - 具有可配置后缀的 SpringPhysicalNamingStrategy
- graphql - GraphQL 产品查询拒绝访问
- android - LiveData 和 Transformations.switchMap 崩溃
- javascript - 下拉从时间选择上一次禁用时间
- vue.js - 如何为不同的表扩展跨度方法
- c# - 如何将所有解决方案包更新到最新的次要版本 Nuget?
- javascript - 将 XLSX 列数据类型修改为文本