清理 python 中的调查数据 - 如何查找和清理两个文件中的公共行?
Cleaning survey data in python - how to finding and cleaning common rows in two files?
我正在做一个调查数据分析项目,它包含 2 个 Excel 个文件——在文件 pre-survey 中,它包含 800 多个响应记录;而在 post-survey 文件中,它包含 500 条回复。它们都(至少)有一个公共列 SID(学生 ID)。中间发生了一些 Y,我有兴趣分析 Y 的有效性,以及降低 Y 对不同类别的人的影响。
更复杂的是,在每个 Excel 文件中,它包含多个选项卡。不同的采访者采访了几位受访者,并在调查的不同部分的每个选项卡中记录。不同选项卡的列可能相同也可能不同,因此很难在一个文件中进行编译。 (或者将它们与大量空值组合在一起真的有意义吗?)
我正在寻找同时进行了预调查和 post- 调查的学生。我如何使用 python/pandas/other 包跨工作表和文件执行此操作?
如果您还可以提出解决问题的方法,将加分。
如果我的理解正确,您的数据当前格式如下
survey1.xlsx
Sheet1(面试官a)
STU-ID QUESTION 1 RESPONSE 1 QUESTION 2 RESPONSE 2
00001 tutoring? True lunch a? False
survey1.xlsx
Sheet2(面试官b)
STU-ID QUESTION 1 RESPONSE 1 QUESTION 2 RESPONSE 2
00004 tutoring? True lunch a? TRUE
survey2.xlsx
Sheet 1
STU-ID QUESTION 1 RESPONSE 1 Tutorer GPA
00001 improvement? True Jim 3.5
survey2.xlsx
Sheet2(面试官b)
STU-ID QUESTION 1 RESPONSE 1 Tutorer GPA
00004 improvement? yes Sally 2.8
如果是这样,在不太了解数据的情况下,我会合并选项卡,以便预调查具有唯一的学生 ID(我不确定是否同一个学生被多个调查员采访)(如果是的话,你可能需要做一个分组,但这听起来很乱)
然后我会对 post 调查回复做同样的事情。然后将它们连接到一个数据框中。从 df 创建一个只有你关心的响应的新 DF(这可以去掉一些 na 答案)。
做一个df.describe,然后做一个df.dtypes
转换数据,使诸如 "yes/no" 之类的答案成为布尔值,或至少使它们具有相同的格式,并且数字响应(int64 或 float64)也相同
最后,我会 dropna,以便 df 遵循您的指导原则,即包含第一次调查和第二次调查的回复。
旁注:只有 800 个回复,仅在 excel 中执行此操作可能更容易,如果您对 python 不满意,则可能需要几个小时才能完成此操作,在 excel 时,可能需要 20 分钟。
如果你的目标是学习 python,那就去吧
Python
import pandas as pd
df_s1s1 = pd.read_excel('survey1.xlsx', na_values="Missing", sheet_names='sheet 1', usecols=cols)
df.head()
df_s1s2 = pd.read_excel('survey1.xlsx', na_values="Missing", sheet_names='sheet 2', usecols=cols)
df_s1s2.head()
然后第二个调查文件也是如此
df_s2s1 = pd.read_excel('survey2.xlsx', na_values="Missing", sheet_names='sheet 1', usecols=cols)
df.head()
df_s2s2 = pd.read_excel('survey2.xlsx', na_values="Missing", sheet_names='sheet 2', usecols=cols)
df_s1s2.head()
要将不同的工作表添加到与行相同的数据框中,您可以使用类似这样的东西
df_survey_1 = pd.concat([df_s1s1, df_s1s2])
df_survey_1.head()
那么第二次调查也是如此
df_survey_2 = pd.concat([df_s2s1, df_s2s2])
df_survey_2.head()
然后要使用所有列创建更大的数据框,您将使用类似这样的东西
master_df = pd.merge(df_survey_1, df_survey2, left_on='STU_ID', right_on='STU_ID')
放弃 NA
master_df = master_df.dropna(axis = 0, how ='any')
希望这对您有所帮助
我正在做一个调查数据分析项目,它包含 2 个 Excel 个文件——在文件 pre-survey 中,它包含 800 多个响应记录;而在 post-survey 文件中,它包含 500 条回复。它们都(至少)有一个公共列 SID(学生 ID)。中间发生了一些 Y,我有兴趣分析 Y 的有效性,以及降低 Y 对不同类别的人的影响。
更复杂的是,在每个 Excel 文件中,它包含多个选项卡。不同的采访者采访了几位受访者,并在调查的不同部分的每个选项卡中记录。不同选项卡的列可能相同也可能不同,因此很难在一个文件中进行编译。 (或者将它们与大量空值组合在一起真的有意义吗?)
我正在寻找同时进行了预调查和 post- 调查的学生。我如何使用 python/pandas/other 包跨工作表和文件执行此操作?
如果您还可以提出解决问题的方法,将加分。
如果我的理解正确,您的数据当前格式如下
survey1.xlsx Sheet1(面试官a)
STU-ID QUESTION 1 RESPONSE 1 QUESTION 2 RESPONSE 2
00001 tutoring? True lunch a? False
survey1.xlsx Sheet2(面试官b)
STU-ID QUESTION 1 RESPONSE 1 QUESTION 2 RESPONSE 2
00004 tutoring? True lunch a? TRUE
survey2.xlsx Sheet 1
STU-ID QUESTION 1 RESPONSE 1 Tutorer GPA
00001 improvement? True Jim 3.5
survey2.xlsx Sheet2(面试官b)
STU-ID QUESTION 1 RESPONSE 1 Tutorer GPA
00004 improvement? yes Sally 2.8
如果是这样,在不太了解数据的情况下,我会合并选项卡,以便预调查具有唯一的学生 ID(我不确定是否同一个学生被多个调查员采访)(如果是的话,你可能需要做一个分组,但这听起来很乱)
然后我会对 post 调查回复做同样的事情。然后将它们连接到一个数据框中。从 df 创建一个只有你关心的响应的新 DF(这可以去掉一些 na 答案)。
做一个df.describe,然后做一个df.dtypes
转换数据,使诸如 "yes/no" 之类的答案成为布尔值,或至少使它们具有相同的格式,并且数字响应(int64 或 float64)也相同
最后,我会 dropna,以便 df 遵循您的指导原则,即包含第一次调查和第二次调查的回复。
旁注:只有 800 个回复,仅在 excel 中执行此操作可能更容易,如果您对 python 不满意,则可能需要几个小时才能完成此操作,在 excel 时,可能需要 20 分钟。
如果你的目标是学习 python,那就去吧
Python
import pandas as pd
df_s1s1 = pd.read_excel('survey1.xlsx', na_values="Missing", sheet_names='sheet 1', usecols=cols)
df.head()
df_s1s2 = pd.read_excel('survey1.xlsx', na_values="Missing", sheet_names='sheet 2', usecols=cols)
df_s1s2.head()
然后第二个调查文件也是如此
df_s2s1 = pd.read_excel('survey2.xlsx', na_values="Missing", sheet_names='sheet 1', usecols=cols)
df.head()
df_s2s2 = pd.read_excel('survey2.xlsx', na_values="Missing", sheet_names='sheet 2', usecols=cols)
df_s1s2.head()
要将不同的工作表添加到与行相同的数据框中,您可以使用类似这样的东西
df_survey_1 = pd.concat([df_s1s1, df_s1s2])
df_survey_1.head()
那么第二次调查也是如此
df_survey_2 = pd.concat([df_s2s1, df_s2s2])
df_survey_2.head()
然后要使用所有列创建更大的数据框,您将使用类似这样的东西
master_df = pd.merge(df_survey_1, df_survey2, left_on='STU_ID', right_on='STU_ID')
放弃 NA
master_df = master_df.dropna(axis = 0, how ='any')
希望这对您有所帮助