Pandas 中,可以将包含列表的列拆分成多行。以下是几种方法来实现这一点,包括使用 apply 和 pd.Series、repeat 和 numpy 等。
1、通过 apply 和 pd.Series 实现
这种方法容易理解,但在性能方面不如其他方法高效。
import pandas as pd
# 创建初始 DataFrame
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]})
print("初始 DataFrame:\n", df)
# 使用 apply 和 pd.Series 拆分成多行
result = df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0: 'B'})
print("\n通过 apply 和 pd.Series 拆分成多行:\n", result)
2、使用 repeat 和 numpy 的 concatenate
这种方法性能较好,但适用于单列的情况。
import pandas as pd
import numpy as np
# 创建初始 DataFrame
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]})
print("初始 DataFrame:\n", df)
# 使用 repeat 和 numpy 的 concatenate 拆分成多行
df_expanded = pd.DataFrame({'A': df.A.repeat(df.B.str.len()), 'B': np.concatenate(df.B.values)})
print("\n使用 repeat 和 numpy 的 concatenate 拆分成多行:\n", df_expanded)
3、创建新的列表
通过列表推导式创建新的 DataFrame。
import pandas as pd
# 创建初始 DataFrame
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]})
print("初始 DataFrame:\n", df)
# 创建新的列表并构造 DataFrame
result = pd.DataFrame([[x] + [z] for x, y in df.values for z in y], columns=df.columns)
print("\n创建新的列表并构造 DataFrame:\n", result)
4、使用 reindex 和 assign
这种方法直接利用 Pandas 的内置方法。
import pandas as pd
import numpy as np
# 创建初始 DataFrame
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]})
print("初始 DataFrame:\n", df)
# 使用 reindex 和 assign 拆分成多行
result = df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
print("\n使用 reindex 和 assign 拆分成多行:\n", result)
5、使用 numpy 高性能实现
这种方法使用 numpy 进行高性能计算。
import pandas as pd
import numpy as np
# 创建初始 DataFrame
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]})
print("初始 DataFrame:\n", df)
# 使用 numpy 高性能实现
new_values = np.dstack((np.repeat(df.A.values, list(map(len, df.B.values))), np.concatenate(df.B.values)))
result = pd.DataFrame(data=new_values[0], columns=df.columns)
print("\n使用 numpy 高性能实现:\n", result)