用python清理调查数据-如何在两个文件中查找和清理常见行?

时间:2019-04-01 14:35:41

标签: python pandas analytics data-science data-cleaning

我正在做一个调查数据分析项目,该项目包含2个Excel文件-在文件 pre-survey 中,它包含800多个响应记录;而在后调查文件中,该文件包含500个答复。他们两个都有(至少)一个公共列SID(学生ID)。在这之间发生了 Y 的情况,我感兴趣的是分析Y的有效性以及导致Y降低对不同类别的人的影响的原因。

更复杂的是,每个Excel文件中都包含多个选项卡。不同的访调员采访了几位受访者,并在每个选项卡中记录了调查的不同部分。不同选项卡的列可能相同或不同,因此很难在一个文件中进行编译。 (或者将它们与大量的空值组合在一起实际上有意义吗?)

我试图找到参加过调查前和调查后的学生。如何使用python / pandas / other包在工作表和文件中完成此操作?

如果您还可以提出解决问题的方法,请加分。

1 个答案:

答案 0 :(得分:3)

如果我正确地理解了这一点,则您的数据当前的格式如下:

survey1.xlsx 工作表1(采访者a)

STU-ID QUESTION 1 RESPONSE 1 QUESTION 2 RESPONSE 2
00001  tutoring?  True       lunch a?   False

survey1.xlsx 工作表2(采访者b)

STU-ID QUESTION 1 RESPONSE 1 QUESTION 2 RESPONSE 2
00004  tutoring?  True        lunch a?  TRUE

survey2.xlsx 工作表1

STU-ID QUESTION 1    RESPONSE 1 Tutorer GPA
00001  improvement?  True       Jim     3.5

survey2.xlsx 工作表2(采访者b)

STU-ID QUESTION 1    RESPONSE 1 Tutorer  GPA
00004  improvement?  yes        Sally    2.8

如果是这样,并且在不完全了解数据的情况下,我将合并这些选项卡,以使预调查具有唯一的学生ID(我不确定同一位学生是否被多位调查员采访过)(如果他们是,您可能需要进行分组,但这听起来很混乱)

然后,我将对调查后的回复执行相同的操作。然后将它们加入单个数据框。在df中创建一个仅包含您关心的响应的新DF(这可以消除一些na答案)。

执行df.describe和df.dtypes

转换数据,使答案(例如“是/否”)成为布尔值或至少是布尔值,因此它们的格式都相同,并且数值响应(int64或float64)也相同

最后,我会去找na,以便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')

希望这会有所帮助