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)