我有一个数据帧,看起来是这样的:

index      key                                   set_col          data
    0     "a1"                                ("a", "b")     "a1_data"   
    1     "a2"                      ("j", "k", "l", "m")     "a2_data"
    2     "b1"       ("z", "y", "x", "w", "v", "u", "t")     "b1_data"

如果集合的长度大于3个元素,我需要拆分set_col,并将其添加到具有相同数据的重复行中,从而产生以下df:

index      key                                   set_col          data
    0     "a1"                                ("a", "b")     "a1_data"   
    1     "a2"                           ("j", "k", "l")     "a2_data"
    2     "a2"                                     ("m")     "a2_data"
    3     "b1"                           ("z", "y", "x")     "b1_data"
    4     "b1"                           ("w", "v", "u")     "b1_data"
    5     "b1"                                     ("t")     "b1_data"

我已经读过使用explodereplaceassign的其他答案,比如thisthis,但都没有处理将列表或集合拆分到一定长度并复制行的情况.

this Answer上,我发现了以下代码:

def split(a, n):
    k, m = divmod(len(a), n)
    return (a[i*k+min(i, m):(i+1)*k+min(i+1, m)] for i in range(n))

我试着应用到这样的专栏中:

df['split_set_col'] = df['set_col'].apply(split(df['set_col'], 3))

但我明白一个错误:

pandas.errors.SpecificationError: nested renamer is not supported

推荐答案

您的函数调用不正确:

df['set_col'].apply(split(df['set_col'], 3))

替换为:

df['set_col'].apply(split, n=3)  # note the n=3 as named argument

该函数也包含错误,请使用np.array_split:

import numpy as np

def split(a, n):
    return np.array_split(a, np.arange(0, len(a), n)[1:])

df['split_set_col'] = df['set_col'].apply(split, n=3)

输出:

>>> df.explode('split_set_col', ignore_index=True)
    key                set_col       data split_set_col
0  "a1"                 (a, b)  "a1_data"        [a, b]
1  "a2"           (j, k, l, m)  "a2_data"     [j, k, l]
2  "a2"           (j, k, l, m)  "a2_data"           [m]
3  "b1"  (z, y, x, w, v, u, t)  "b1_data"     [z, y, x]
4  "b1"  (z, y, x, w, v, u, t)  "b1_data"     [w, v, u]
5  "b1"  (z, y, x, w, v, u, t)  "b1_data"           [t]

Python-3.x相关问答推荐

如何获得给定列表中所有可能的元素组合?

如何使用regex将电话号码和姓名从文本字符串中分离出来

估计列表中连续对的数量

如何在当前测试中使用fixture 转换后的数据进行参数化?

Python根据条件从多行读取值

在Pandas中,根据另一列中的重复值将数据分组为一列

如何转置和 Pandas DataFrame 并命名新列?

Python BeautifulSoup:在 Select 语句中排除其他标签

将名字转换成姓氏、首字母和中间字母的格式

Pytorch:图像标签

python tkInter 浏览文件夹按钮

Tkinter AttributeError:对象没有属性'tk'

如何模拟 Django 模型对象(及其方法)?

无论如何我可以在 Google colaboratory 中下载文件吗?

为什么 string.maketrans 在 Python 3.1 中不起作用?

plt.cm.get_cmap 中可以使用哪些名称?

尾部斜杠的 FastAPI 重定向返回非 ssl 链接

如何从 seaborn / matplotlib 图中删除或隐藏 x 轴标签

十六进制字符串到 Python 3.2 中的带符号整数?

交错4个相同长度的python列表