我有一个大约 20 个 dfs 的列表,我想清理数据进行分析。 如果所有列都相同,是否可以有一个函数循环遍历列表中的所有 dfs 并执行以下任务?
创建一个列 [time_class],通过与 [appt_time] 列进行比较,将每个到达时间分类为"早"或"晚"。接下来,我想在另一名为 [time_response] 的列中将每条记录分类为"early_yes"、"early_no"、"late_yes"和"late_no"。此列将检查 [time_class]、[是] 和 [否] 的值。如果记录是"早期","1"表示是,则 [time_response] 列应显示"early_yes",然后是用于计算 [time_response] 发生的频率表。频率表标题将来自 [time_response] 列。
如何检查以确保时间列在熊猫中读取为时间? 如何将"是"和"否"列中的值更改为"是"和"否"而不是 1?
对于以下特定列,每个 DF 都有以下格式:
Arrival_time Appt_Time YES NO
07:25:00 08:00 1
08:24:00 08:40 1
08:12:00 09:00 1
09:20:00 09:30 1
10:01:00 10:00 1
09:33:00 09:30 1
10:22:00 10:20 1
10:29:00 10:30 1
我在每个 df 中还有一个年龄列,我尝试使用 cut(( 方法进行分箱,我通常会收到输入必须是一维数组的错误。这是否意味着如果 df 除了年龄之外还有其他列,我就无法使用此方法?
如何定义一个函数来检查年龄列并创建按 10 [20-100] 分组的箱,然后使用这些箱创建频率表?理想情况下,我希望频率表是每个 df 中的列。我正在使用熊猫。
任何帮助不胜感激!!
更新:当我尝试比较到达时间和计划时间时,我收到一个类型错误类型错误:"<="在"int"和"datetime.time"的实例之间不受支持
希望这可以帮助您入门 - 您将看到有一些有用的方法,例如在熊猫中replace
和 numpy 库中的select
。此外,如果要将任何代码应用于所有格式相同的多个数据帧,则需要将此代码包装在函数中。
import numpy as np
import pandas as pd
### this code helps recreate the df you posted
df = pd.DataFrame({
"Arrival_time": ['07:25:00', '08:24:00', '08:12:00', '09:20:00', '10:01:00', '09:33:00', '10:22:00', '10:29:00'],
"Appt_Time":['08:00', '08:40', '09:00', '09:30', '10:00', '09:30', '10:20', '10:30'],
"YES": ['1','1','','','','1','','1'],
"NO": ['','','1','1','1','','1','']})
df.Arrival_time = pd.to_datetime(df.Arrival_time, format='%H:%M:%S').dt.time
df.Appt_Time = pd.to_datetime(df.Appt_Time, format='%H:%M').dt.time
### end here
# you can start using the code from this line onward:
# creates "time_class" column based on Arrival_time being before Appt_Time
df["time_class"] = (df.Arrival_time <= df.Appt_Time).replace({True: "early", False: "late"})
# creates a new column "time_response" based on conditions
# this may need to be changed depending on whether your "YES" and "NO" columns
# are a string or an int... I just assumed a string so you can modify this code as needed
conditions = [
(df.time_class == "early") & (df.YES == '1'),
(df.time_class == "early") & (df.YES != '1'),
(df.time_class == "late") & (df.YES == '1'),
(df.time_class == "late") & (df.YES != '1')]
choices = ["early_yes", "early_no", "late_yes", "late_no"]
df["time_response"] = np.select(conditions, choices)
# creates a new df to sum up each time_response
df_time_response_count = pd.DataFrame({"Counts": df["time_response"].value_counts()})
# replace 1 with YES and 1 with NO in your YES and NO columns
df.YES = df.YES.replace({'1': "YES"})
df.NO = df.NO.replace({'1': "NO"})
输出:
>>> df
Arrival_time Appt_Time YES NO time_class time_response
0 07:25:00 08:00:00 YES early early_yes
1 08:24:00 08:40:00 YES early early_yes
2 08:12:00 09:00:00 NO early early_no
3 09:20:00 09:30:00 NO early early_no
4 10:01:00 10:00:00 NO late late_no
5 09:33:00 09:30:00 YES late late_yes
6 10:22:00 10:20:00 NO late late_no
7 10:29:00 10:30:00 YES early early_yes
>>> df_time_response_count
Counts
early_yes 3
late_no 2
early_no 2
late_yes 1
为了回答你关于分箱的问题,我认为 np.linspace(( 最容易创建你想要的分箱。
因此,我将在 df 中添加一些介于 20 到 100 之间的随机年龄:
df['age'] = [21,31,34,26,46,70,56,55]
因此,数据帧如下所示:
df
Arrival_time Appt_Time YES NO time_class time_response age
0 07:25:00 08:00:00 YES early early_yes 21
1 08:24:00 08:40:00 YES early early_yes 31
2 08:12:00 09:00:00 NO early early_no 34
3 09:20:00 09:30:00 NO early early_no 26
4 10:01:00 10:00:00 NO late late_no 46
5 09:33:00 09:30:00 YES late late_yes 70
6 10:22:00 10:20:00 NO late late_no 56
7 10:29:00 10:30:00 YES early early_yes 55
然后在熊猫中使用 value_counts 方法和 bins 参数:
df_age_counts = pd.DataFrame({"Counts": df.age.value_counts(bins = np.linspace(20,100,9))})
df_age_counts = df_age_counts.sort_index()
输出:
>>> df_age_counts
Counts
(19.999, 30.0] 2
(30.0, 40.0] 2
(40.0, 50.0] 1
(50.0, 60.0] 2
(60.0, 70.0] 1
(70.0, 80.0] 0
(80.0, 90.0] 0
(90.0, 100.0] 0