1、实现的效果
1)创建初始 DataFrame
import pandas as pd df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) print("初始 DataFrame:\n", df)
2)拆分成多行的效果
import pandas as pd df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) print("初始 DataFrame:\n", df) result = df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0: 'B'}) print("拆分成多行后的 DataFrame:\n", result)
2、拆分成多行的方法
1)通过 apply 和 pd.Series 实现
import pandas as pd df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) result = df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0: 'B'}) print("方法 1:通过 apply 和 pd.Series 实现:\n", result)
2)使用 repeat 和 DataFrame 构造函数
import pandas as pd import numpy as np df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) df_expanded = pd.DataFrame({'A': df.A.repeat(df.B.str.len()), 'B': np.concatenate(df.B.values)}) print("方法 2:使用 repeat 和 DataFrame 构造函数:\n", df_expanded)
或
import pandas as pd import numpy as np
s = pd.DataFrame({'B': np.concatenate(df.B.values)}, index=df.index.repeat(df.B.str.len())) df_joined = s.join(df.drop('B', 1), how='left') print("方法 2:使用 repeat 和 DataFrame 构造函数(join):\n", df_joined)
3)创建新的列表
import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) result = pd.DataFrame([[x] + [z] for x, y in df.values for z in y], columns=df.columns) print("方法 3:创建新的列表:\n", result)
或
import pandas as pd # 创建初始 DataFrame df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}, index=['x', 'y']) print("初始 DataFrame:\n", df) # 使用方法 3:创建新的列表并合并回原始 DataFrame s = pd.DataFrame([[x] + [z] for x, y in zip(df.index, df.B) for z in y]) s_merged = s.merge(df, left_on=0, right_index=True) print("\n方法 3:创建新的列表(多于两列):\n", s_merged)
4)使用 reindex 和 loc 实现
import pandas as pd import numpy as np df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) result = df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values)) print("方法 4:使用 reindex 和 loc 实现:\n", result)
5)使用 numpy 高性能实现
import numpy as np import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]}) 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("方法 5:使用 numpy 高性能实现:\n", result)