Python Pandas list(列表)数据列拆分成多行的方法

Pandas 中,可以将包含列表的列拆分成多行。以下是几种方法来实现这一点,包括使用 apply 和 pd.Series、repeat 和 numpy。本文主要介绍Python pandas中列的数据是df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]}),多个列表的情况,将列的数据拆分成多行的几种方法。

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)

推荐阅读
cjavapy编程之路首页