如何对包含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)