如何对包含Python中元组列表的PandasDataFrame列执行各种操作?

我有一个 Pandas DataFrame,其中一列resources包含一个元组列表。例如,采用以下 DataFrame:

df = pd.DataFrame({"id": [1, 2, 3],
                   "resources": [[(1, 3), (1, 1), (2, 9)], 
                               [(3, 1), (3, 1), (3, 4)], 
                               [(9, 0), (2, 6), (5,5)]]
                  })

现在,我想将以下列添加到我的 DataFrame 中,其中包含以下内容:

  • first包含一个列表的列,其中元组的第一个元素是唯一的resources(所以基本上是所有第一个元素的集合)
  • second包含一个列表的列,其中包含元组的唯一第二个元素resources(因此基本上是所有第二个元素的集合)
  • same包含resources具有相同第一个和第二个元素的元组数的列
  • different包含resources具有不同第一和第二元素的元组数的列

所需的输出列如下所示:

  • first[[1, 2], [3], [9, 2, 5]]
  • second[[1, 3, 9], [1, 4], [0, 6, 5]]
  • same[1, 0, 1]
  • different[2, 3, 2]

如何以最少的时间实现这一目标?我首先考虑使用Series.str,但在那里找不到足够的功能来实现我的目标

回答

df["first"] = df["resources"].apply(lambda x: [*set(i for i, _ in x)])
df["second"] = df["resources"].apply(lambda x: [*set(i for _, i in x)])
df["same"] = df["resources"].apply(lambda x: sum(len(set(t)) == 1 for t in x))
df["different"] = df["resources"].apply(
    lambda x: sum(len(set(t)) > 1 for t in x)
)

print(df)

印刷:

df["first"] = df["resources"].apply(lambda x: [*set(i for i, _ in x)])
df["second"] = df["resources"].apply(lambda x: [*set(i for _, i in x)])
df["same"] = df["resources"].apply(lambda x: sum(len(set(t)) == 1 for t in x))
df["different"] = df["resources"].apply(
    lambda x: sum(len(set(t)) > 1 for t in x)
)

print(df)

  • [What does the star and doublestar operator mean in a function call?](https://stackoverflow.com/q/2921847/15497888)

以上是如何对包含Python中元组列表的PandasDataFrame列执行各种操作?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>