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

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)

参考文档:Python Pandas list(列表)数据列拆分成多行的方法-CJavaPy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值