定义函数以对 df 中的记录进行分类并添加新列.熊猫 dfs



我有一个大约 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

最新更新