gpt4 book ai didi

python - Pandas:合并数据帧并仅保留与合并的唯一对关联的最小值

转载 作者:太空宇宙 更新时间:2023-11-03 21:27:49 24 4
gpt4 key购买 nike

我在处理 pandas 时遇到了更棘手的问题。

我正在定义组的列 V 上合并两个数据帧。

两个数据帧还有一个唯一的 ID 列和一个 Time 列。

合并后,我计算这两列之间的Timedelta并过滤掉负值:

import pandas as pd

L11 = ['V1','V1','V1','V2','V2','V3','V3','V3','V3']
L12 = [1,2,3,4,5,6,7,8,9]
L13 = [pd.Timestamp("1.1.1980 12:12:12"),
pd.Timestamp("1.1.1980 13:12:12"),
pd.Timestamp("1.2.1980 01:12:12"),
pd.Timestamp("1.1.1980 14:12:12"),
pd.Timestamp("1.1.1980 16:12:12"),
pd.Timestamp("1.1.1980 16:12:12"),
pd.Timestamp("1.1.1980 14:12:12"),
pd.Timestamp("1.1.1980 13:12:12"),
pd.Timestamp("1.2.1980 10:12:12")]

L21 = ['V1','V1','V2','V3','V3','V3','V3','V3','V3']
L22 = [11,12,13,14,15,16,17,18,19]
L23 = [pd.Timestamp("1.1.1980 12:12:12"),
pd.Timestamp("1.1.1980 13:12:12"),
pd.Timestamp("1.1.1980 14:12:12"),
pd.Timestamp("1.1.1980 14:12:12"),
pd.Timestamp("1.1.1980 16:12:12"),
pd.Timestamp("1.1.1980 18:12:12"),
pd.Timestamp("1.1.1980 11:12:12"),
pd.Timestamp("1.1.1980 12:12:12"),
pd.Timestamp("1.2.1980 10:12:12")]

df1 = pd.DataFrame({'V':L11,'ID1':L12,'Time1':L13})
df2 = pd.DataFrame({'V':L21,'ID2':L22,'Time2':L23})

df = pd.merge(df1,df2,on='V')
df["Delta"] = df.Time1-df.Time2
df = df[df.Delta>pd.Timedelta(0)].copy()
df = df.drop(["Time1","Time2"],axis=1)

此外,我还计算每个数据帧中每个V组有多少个条目,并得到较低的值,我将其称为Max,因为它将是允许的最大值每组合并条目的值。这可确保两侧每个 V 组的 ID 值可以是唯一的。

df1g = df1.groupby("V").ID1.count().reset_index().rename(columns={"ID1":"C1"})
df2g = df2.groupby("V").ID2.count().reset_index().rename(columns={"ID2":"C2"})
df12g = pd.merge(df1g,df2g,on='V')
df12g["Max"] = df12g[["C1","C2"]].min(axis=1)
df = pd.merge(df,df12g[['V','Max']],on='V')
df = df.sort_values(['V','Delta']).reset_index(drop=True)

这是我排序的示例数据:

     V  ID1  ID2    Delta  Max
0 V1 2 11 01:00:00 2
1 V1 3 12 12:00:00 2
2 V1 3 11 13:00:00 2
3 V2 5 13 02:00:00 1
4 V3 8 18 01:00:00 4
5 V3 6 14 02:00:00 4
6 V3 7 18 02:00:00 4
7 V3 8 17 02:00:00 4
8 V3 7 17 03:00:00 4
9 V3 6 18 04:00:00 4
10 V3 6 17 05:00:00 4
11 V3 9 16 16:00:00 4
12 V3 9 15 18:00:00 4
13 V3 9 14 20:00:00 4
14 V3 9 18 22:00:00 4
15 V3 9 17 23:00:00 4
  • V1 有 3 个条目,但只允许 2 个
  • V2 有 1 个条目,且仅允许 1 个
  • V3有12个条目,但只允许4个

我现在需要为每个 ID1 查找具有最低 DeltaID2 条目,但组合必须是唯一的。

这意味着因为 4 行中的 ID1 86 行中的 ID2 18 配对 ID1 7 不得与 ID2 18 配对。

我想要的结果基本上是这样的:

     V  ID1  ID2    Delta  Max
0 V1 2 11 01:00:00 2
1 V1 3 12 12:00:00 2
3 V2 5 13 02:00:00 1
4 V3 8 18 01:00:00 4
5 V3 6 14 02:00:00 4
8 V3 7 17 03:00:00 4
11 V3 9 16 16:00:00 4

我不知道如何实现这一目标。

简单的方法,例如

df1 = df.drop_duplicates('ID1')
df2 = df.drop_duplicates('ID2')
result = pd.merge(df1,df2)

显然不能正常工作。

是否有可能在不迭代已排序的行并构建已占用的 ID2 值的内存的情况下解决此问题?

最佳答案

iterrows() 方法回答我自己的问题:

行后

df = df.sort_values(['V','Delta']).reset_index(drop=True)

这解决了问题:

df["Keep"] = False
old_V = ''
for i,row in df.iterrows():
if row.V != old_V:
old_V = row.V
ID1_list = []
ID2_list = []
if row.ID1 not in ID1_list and row.ID2 not in ID2_list:
df.iloc[i,5] = True
ID1_list.append(row.ID1)
ID2_list.append(row.ID2)
df = df[df.Keep].drop("Keep",axis=1)

关于python - Pandas:合并数据帧并仅保留与合并的唯一对关联的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53740911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com