[英]Pandas DataFrame how to compare each cell of a colum with each cell of another column in another dataframe and drop matching ones
[英]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"})
首先,您按類別對每個 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。
# 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.