在Pandas DataFrame中将一维数组列转换为二维数组列的长度
问题描述
现有一个带一维数组列(1d_col)和二维数组列(2d_col)的Pandas DataFrame,输入数据如下:
| 1d_col | 2d_col |
|---|---|
| ["negative", "positive"] | [["zero", ""], ["one", ""]] |
| ["positive", "negative"] | [["two", ""], ["zero", ""]] |
| ["negative"] | [["minus", ""]] |
| ["positive"] | [["three", ""]] |
需要把1d_col转成和2d_col结构匹配的new_col,最终输出的DataFrame要长成这样:
| 2d_col | new_col |
|---|---|
| [["zero", ""], ["one", ""]] | [["negative", "negative"], ["positive", "positive"]] |
| [["two", ""], ["zero", ""]] | [["positive", "positive"], ["negative", "negative"]] |
| [["minus", ""]] | [["negative", "negative"]] |
| [["three", ""]] | [["positive", "positive"]] |
解决方案
咱们可以用apply加列表推导式搞定这个需求,核心逻辑很简单:
- 对每一行,先拿到
2d_col里每个子数组的长度 - 把
1d_col里的对应元素重复子数组长度的次数,拼成新的子数组 - 最后把这些新子数组组合成和
2d_col结构一致的new_col
代码实现
import pandas as pd # 先搭好输入的DataFrame df = pd.DataFrame({ '1d_col': [ ["negative", "positive"], ["positive", "negative"], ["negative"], ["positive"] ], '2d_col': [ [["zero", ""], ["one", ""]], [["two", ""], ["zero", ""]], [["minus", ""]], [["three", ""]] ] }) # 写个处理每一行的函数 def process_row(row): # 先算出2d_col里每个子数组的长度 sub_arr_lengths = [len(sub) for sub in row['2d_col']] # 把1d_col的元素对应重复,生成new_col的结构 new_col = [[val]*length for val, length in zip(row['1d_col'], sub_arr_lengths)] return new_col # 把函数应用到每一行,生成new_col df['new_col'] = df.apply(process_row, axis=1) # 只保留需要的两列,得到结果 result_df = df[['2d_col', 'new_col']] print(result_df)
代码说明
- 构建输入数据:按照示例创建对应的Pandas DataFrame。
- 行处理函数
process_row:- 遍历当前行的
2d_col,获取每个子数组的长度,比如第一行的两个子数组长度都是2。 - 用
zip把1d_col的元素和对应子数组长度配对,把每个元素重复指定次数组成新子数组,比如"negative"重复2次就得到["negative", "negative"]。
- 遍历当前行的
- 生成新列:通过
apply把处理函数作用到每一行,生成new_col。 - 整理结果:筛选出
2d_col和new_col两列,就是咱们要的输出。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

