Pandas:如何过滤具有一对多和一对一关系的参数

2024-09-29 22:25:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个表的数据集。有些字段重叠,但在某些表上,它们可能具有一对多关系,而在其他表上,它们可能具有一对一关系。我正在尝试创建一个新的数据框,在这个数据框中,我可以获取与一个字段(一对一)相关联的值,以及与同一个字段相关联的值,但在另一个表中(一对多),并将它们全部列在新的数据框中(一对多)

一个数据帧:

         finishtId eventId instanceId  ...       value statusId finishType
0               1     18        1  ...           218.3        1   Positive
1               2     18        2  ...         217.586        1   Positive
2               3     18        3  ...         216.719        1   Positive
3               4     18        4  ...         215.464        1   Positive
4               5     18        5  ...         218.385        1   Negative

另一个数据帧:

      eventId  instanceId red blue     time duration  milliseconds
0        841       153     1    1  17:05:23   26.898         26898
1        841        30     1    1  17:05:52   25.021         25021
2        841        17     1   11  17:20:48   23.426         23426
3        841         4     1   12  17:22:34   23.251         23251
4        841        13     1   13  17:24:10   23.842         23842
5.       841.      153.    2   45. 17:45:30.  24.786.        26473
     ...       ...   ...  ...       ...      ...           ...
7633    1036       822     2   48  16:20:38   22.143         22143
7634    1036         1     2   50  16:23:05   21.853         21853
7635    1036       849     2   49  16:24:00   22.475         22475
7636    1036       154     2   62  16:42:16   24.010         24010
7637    1036       822     3   64  16:42:47   22.607         22607

我想创建一个新的dataframe,将dataframe2中的所有值(红色、蓝色、时间、持续时间、毫秒)附加到instanceId和eventId字段,以便dataframe1显示一对多关系。我还想创建一个新字段,告诉我每个instanceId和eventId(numRed)有多少个红色,基本上如下所示:

          eventId instanceId  red  numRed blue  ...     time  duration   value statusId finishType
0             841    153        1       2   17  ... 17:05:23    26.898   218.3        1   Positive
1             841    153        2       2   52  ... 17:45:30    24.786 217.586        1   Positive
1             841    146        1       1   40  ... 17:32:30    24.986 217.586        1   Negative

因此,基本上每个eventId的每个instanceId都会列出每个红色、蓝色、时间、持续时间、值、状态ID和finishType。我是熊猫队的新手,所以我一直在挖掘函数,但我经常会遇到与数据类型(float vs str)等相关的错误

更新:从Edunne那里得到解决方案后,我意识到我认为对数据集更有效的其实是其他东西。我更喜欢合并每个“eventId”的每个“instanceId”的“红色”值行。不同的值将被平均化,“持续时间”的平均值和“值”字段的平均值。像这样的东西:

          eventId instanceId  numRed ...  duration   value statusId finishType
0             841    153          2  ...     25.842   218.3        1   Positive
1             841    146          1  ...     24.986 217.586        1   Negative

Tags: 数据关系valuebluered持续时间duration红色
1条回答
网友
1楼 · 发布于 2024-09-29 22:25:28

你应该让我们看看你试过什么!让人们更容易回答

熊猫Merge是我的方法。比如:

new_df = df2.merge(df1, on=["eventID", "instanceId"], how="outer")

新的_df将包含df2中的所有行以及df2中的任何匹配行

如果“eventID”或“instanceId”的数据类型在两个数据帧中不同,您可能会遇到问题,但这应该很容易解决

编辑 可能在找group_by。在加入/合并另一个数据帧之前,应在第二个数据帧上执行聚合

# Dictionary with keys as column names and values as the aggregation/summary method.
agg_dict = {
    "duration": "mean",
    "value": "mean"
}
group_by_columns = ["eventID", "instanceId"] # We'll get one row in output for each combination of these columns
new_df2 = df2.groupby(group_by_columns).agg(agg_dict).reset_index()

result = new_df2.merge(df1, on=["eventID", "instanceId"], how="outer")

让我知道进展如何

相关问题 更多 >

    热门问题