簡體   English   中英

Pandas Dataframe Python | 如何將一個單元格與復制的 dataframe 的另一個單元格進行比較?

[英]Pandas Dataframe Python | How to compare a cell with another cell of a copied dataframe?

我有 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)。

最終結果新 dataframe:

類別 開始時間 時間結束
一個 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"})

解釋

  1. 首先,您按類別對每個 DataFrame 進行分組,以保持其每個值的最小值和最大值。 這也會將索引設置為 CATEGORY。

     grouped_1 = df_1.groupby("CATEGORY").agg([min, max]) grouped_2 = df_2.groupby("CATEGORY").agg([min, max])
  2. 然后,您執行內部連接以僅保留 df_1 和 df_2 中的 CATEGOries。 默認情況下,內部連接是在索引上完成的,這就是我們在這里想要的(我們原始 DataFrame 中的列 CATEGORY)。 您水平連接,得到 4 列:每行兩個最小值和兩個最大值。

     grouped_both = pd.concat([grouped_1, grouped_2], join="inner", axis=1)
  3. 您保留每行的最小值和最大值,並重命名列。

     final_df = grouped_both.apply([min, max], axis=1).rename(columns={"min":"START TIME", "max":"END TIME"})

注意:我假設您想合並兩個 DataFrame 的第一個和最后一個時間戳。 如果您真的想要從 df_1 開始並從 df_2 結束,那將是一個稍微不同的解決方案。

1個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"})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM