📅  最后修改于: 2023-12-03 14:45:03.973000             🧑  作者: Mango
在 Pandas 中,我们可以使用 str 属性对字符串型的列进行拆分和切片操作,但是如果我们的数据中存在元组列,该如何进行操作呢?下面是一个示例数据:
import pandas as pd
import numpy as np
data = [("a", (1, 2)), ("b", (3, 4)), ("c", (5, 6))]
df = pd.DataFrame(data, columns=["col1", "col2"])
print(df)
输出结果如下:
col1 col2
0 a (1, 2)
1 b (3, 4)
2 c (5, 6)
可以看到,我们的数据中存在元组列 col2。如果我们想要将元组列进行拆分,并将其中的元素分别赋值给不同的列,该如何进行操作呢?
一种简单的方法是使用 apply 函数,对每个元素进行操作。具体实现代码如下:
df[["col2_1", "col2_2"]] = df["col2"].apply(pd.Series)
df = df.drop("col2", axis=1)
print(df)
输出结果如下:
col1 col2_1 col2_2
0 a 1 2
1 b 3 4
2 c 5 6
我们使用 apply 函数对 col2 进行处理,并将处理结果拆分为两列 col2_1 和 col2_2。最后将原来的 col2 列删除。
在上面的示例中,我们只有一个元组列需要进行拆分操作。如果我们有多个元组列需要处理,可以使用循环语句对每个元组列进行操作。具体代码如下:
for col in ["col2", "col3", "col4"]:
df[[f"{col}_1", f"{col}_2"]] = df[col].apply(pd.Series)
df = df.drop(col, axis=1)
print(df)
上述代码中,我们使用了一个 for 循环语句,对每个元组列进行操作,并为每个元组列的拆分结果添加了对应的列名称。
除了使用 apply 函数外,我们还可以使用 applymap 函数对 DataFrame 中的每一个元素进行操作。具体代码如下:
df = df.applymap(lambda x: x[0] if isinstance(x, tuple) else x)
print(df)
在上述代码中,我们使用了 applymap 函数,并将 lambda 表达式传递给该函数。该 lambda 表达式判断了每个元素是否为元组类型,如果是,则返回该元组的第一个元素。如果不是,则直接返回该元素的值。
最后,我们将处理结果输出。输出结果如下:
col1 col2_1 col2_2 col3_1 col3_2 col4_1 col4_2
0 a 1 2 3 4 A B
1 b 5 6 7 8 C D
2 c 9 10 11 12 E F