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

Pet*_*ter 1 python python-3.x pandas

我有一个 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)]]
                  })
Run Code Online (Sandbox Code Playgroud)

现在,我想将以下列添加到我的 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,但在那里找不到足够的功能来实现我的目标

And*_*ely 6

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)
Run Code Online (Sandbox Code Playgroud)

印刷:

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)
Run Code Online (Sandbox Code Playgroud)

  • [函数调用中的星号和双星运算符是什么意思?](/sf/ask/204529321/) (3认同)