Python Pandas DataFrame未知列列表拆分为行的实现方法
解决方法:将DataFrame中列的列表元素转为对应行
针对你这种每列都是列表数据、想要把列表元素横向转纵向对应成行的需求,这里有几种实用的方法,根据你的pandas版本来选择:
方法一:使用explode(推荐,pandas 1.3.0+)
从pandas 1.3.0版本开始,explode支持同时对多列进行操作,只要每列的列表长度一致,一行代码就能搞定:
import pandas as pd # 假设你的DataFrame名为df result = df.explode(df.columns.tolist()) # 重置索引(可选,去掉原来的行索引) result = result.reset_index(drop=True)
举个实际例子,比如你的输入DataFrame是:
data = { 'numberArray1': [[32.09561, 32.43092, 32.37599]], 'numberArray10': [[37.015972, 37.015972, 36.889534]], 'numberArray11': [[996.2953, 996.2609, 996.28845]] } df = pd.DataFrame(data)
运行上面的代码后,result就是你想要的结构:
| numberArray1 | numberArray10 | numberArray11 |
|---|---|---|
| 32.09561 | 37.015972 | 996.2953 |
| 32.43092 | 37.015972 | 996.2609 |
| 32.37599 | 36.889534 | 996.28845 |
方法二:兼容旧版pandas(1.3.0以下)
如果你的pandas版本较低,不支持多列explode,可以用apply结合pd.DataFrame来实现:
# 遍历每一行,将每个列的列表转为DataFrame的列,再合并所有行的结果 result = df.apply(lambda row: pd.DataFrame({col: row[col] for col in df.columns}), axis=1).concat() # 重置索引 result = result.reset_index(drop=True)
这个方法同样能得到和上面一致的结果,只是代码稍微长一点。
处理列表长度不一致的情况
如果不同列的列表长度不一样,直接explode会报错,这时候可以根据需求处理:
1. 截断到最短列表的长度
# 获取所有列中最短的列表长度 min_length = min(df.apply(lambda col: len(col.iloc[0])).values) # 截断每个列的列表到最短长度 df_truncated = df.apply(lambda col: col.apply(lambda lst: lst[:min_length])) # 再执行explode result = df_truncated.explode(df.columns.tolist())
2. 填充NaN到最长列表的长度
# 获取所有列中最长的列表长度 max_length = max(df.apply(lambda col: len(col.iloc[0])).values) # 给短列表填充NaN,补到最长长度 df_padded = df.apply(lambda col: col.apply(lambda lst: lst + [pd.NA]*(max_length - len(lst)))) # 执行explode result = df_padded.explode(df.columns.tolist())
这样就能处理不同长度列表的情况,避免报错。
内容的提问来源于stack exchange,提问作者Ahmad Ahsan Saleem
相关产品推荐
相关产品推荐

