python - 熊猫数据框 Python | 如何将一个单元格与复制的数据帧的另一个单元格进行比较?
问题描述
我有 2 个不同名称的相同数据框(df_1 和 df_2)。
假设数据框有 2 列类别和时间。例如。
类别 | 时间 |
---|---|
一个 | 2020-02-02 05:05:05.0000 |
一个 | 2020-02-02 06:06:06.0000 |
一个 | 2020-02-02 07:07:07.0000 |
乙 | 2020-02-02 05:05:05.0000 |
乙 | 2020-02-02 06:06:06.0000 |
C | 2020-02-02 05:05:05.0000 |
C | 2020-02-02 06:06:06.0000 |
我想要以下 if 条件:如果 df_1 的类别与 df_2 的类别匹配,那么,在一个新的数据帧中(列:类别、开始时间、结束时间),如果是 A 类别,我想放置第一个日期时间(2020-02 -02 05:05:05.0000) 在结束时间列中的开始时间和最后日期时间 (2020-02-02 07:07:07.0000)。
最终结果新数据框:
类别 | 开始时间 | 时间结束 |
---|---|---|
一个 | 2020-02-02 05:05:05.0000 | 2020-02-02 07:07:07.0000 |
乙 | 2020-02-02 05:05:05.0000 | 2020-02-02 06:06:06.0000 |
C | 2020-02-02 05:05:05.0000 | 2020-02-02 06:06:06.0000 |
我怎样才能做到这一点?请帮忙。
解决方案
原始答案的解决方案
pd.concat([df_1.groupby("CATEGORY").agg([min, max]),
df_2.groupby("CATEGORY").agg([min, max])],
join="inner", axis=1).apply([min, max], axis=1)
.rename(columns={"min":"START TIME", "max":"END TIME"})
解释
首先,您按 CATEGORY 对每个 DataFrame 进行分组,以保持其每个值的最小值和最大值。这也会将索引设置为 CATEGORY。
grouped_1 = df_1.groupby("CATEGORY").agg([min, max]) grouped_2 = df_2.groupby("CATEGORY").agg([min, max])
然后,您执行内部连接以仅保留 df_1 和 df_2 中的 CATEGOries。默认情况下,内部连接是在索引上完成的,这就是我们在这里想要的(我们原始 DataFrame 中的列 CATEGORY)。您水平连接,得到 4 列:每行两个最小值和两个最大值。
grouped_both = pd.concat([grouped_1, grouped_2], join="inner", axis=1)
您保留每行的最小值和最大值,并重命名列。
final_df = grouped_both.apply([min, max], axis=1) .rename(columns={"min":"START TIME", "max":"END TIME"})
注意:我假设您想合并两个 DataFrame 的第一个和最后一个时间戳。如果您真的想要从 df_1 开始并从 df_2 结束,那将是一个稍微不同的解决方案。
一个 DataFrame 并添加持续时间的解决方案
如果我理解正确,那么您不需要复制原始 DataFrame。
# Group the DataFrame by CATEGORY and keep the min and max values
# We also need to get rid of the newly created MultiIndex level "TIME"
joined_df = df_1.groupby("CATEGORY").agg([min, max])["TIME"]
# Keep only rows where the min is different than the max
joined_df = joined_df[joined_df["min"]!= joined_df["max"]]
# Calculate the time deltas between min and max
# then cast it to a number value of the minutes
joined_df["DURATION"] = (joined_df[ "max"]- joined_df["min"]).astype('timedelta64[m]')
# We rename the columns min and max
joined_df = joined_df.rename(columns={"min":"START TIME", "max":"END TIME"})
推荐阅读
- typescript - 在 tsc 和 tslint 之间共享 ast
- typo3 - realurl 和 tx_cal 缓存溢出
- android - 如何通过数据绑定使用 mvvm 模式
- java - Spring Boot Webservice SOAP 错误:必须将 Content-Encoding 设置为 gzip
- angular - switchMap 类型 void 不可分配给类型 ObservableInput<{}>
- javascript - 数据未显示在材料 ui 的选择框中
- android - 将活动作为参数发送到列表视图的自定义适配器,然后也将其发送到弹出菜单类,然后意图相同的活动
- javafx - JavaFx 画布鼠标事件
- java - Maven + MWE2Launcher + XText 模型引用了一个未编译的 Java 类
- c# - c#比较MS Word中的样式对象