Pandas:将一列的列表大小与另一列相同

4 投票
2 回答
65 浏览
提问于 2025-04-14 17:21

我有两列数据:serial_numberinv_number,它们里面各自包含一些列表。如果一个 inv_number 对应多个 serial_number,我需要把 inv_number 的列表大小调整到和 serial_number 一样大。

    serial_number                                       inv_number
28  [С029768, С029775]                                  [101040031171, 101040031172]
29  [090020960190402011, 090020960190402009]            [210134002523, 210134002524]
31  [1094]                                              [410124000215]
32  [01]                                                [101040022094]
33  [F161B5, F17D86, F17D8D, F1825C, F1825A, F1825D]    [101040026976]

在索引 33 的地方,我们有 6 个序列号,但只有一个库存号,所以它应该被改成这样:

[101040026976, 101040026976, 101040026976, 101040026976, 101040026976, 101040026976]

我试过用“乘法”来生成一个列表(像这样 [value] * N):

si.loc[si['inv_number'].apply(len)==1, 'inv_number'].apply
    (lambda x: [str(x[0])] * si['serial_number'].apply(len).values)

但是这样会出现一个错误:

UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U12'), dtype('int64')) -> None

我该怎么解决这个问题呢?

2 个回答

3

使用 maplenmul

df["inv_number"] *= (-df.map(len).diff(axis=1).iloc[:, -1]).add(1)
序列号 发票号
0 ['С029768', 'С029775'] ['101040031171', '101040031172']
1 ['090020960190402011', '090020960190402009'] ['210134002523', '210134002524']
2 ['1094'] ['410124000215']
3 ['01'] ['101040022094']
4 ['F161B5', 'F17D86', 'F17D8D', 'F1825C', 'F1825A', 'F1825D'] ['101040026976', '101040026976', '101040026976', '101040026976', '101040026976', '101040026976']
4

试试这个:

mask = (df["serial_number"].str.len() > 1) & (df["inv_number"].str.len() == 1)
df.loc[mask, "inv_number"] = df["serial_number"].str.len() * df.loc[mask, "inv_number"]

print(df)

输出结果是:

                                       serial_number                                                                            inv_number
28                                [С029768, С029775]                                                          [101040031171, 101040031172]
29          [090020960190402011, 090020960190402009]                                                          [210134002523, 210134002524]
31                                            [1094]                                                                        [410124000215]
32                                              [01]                                                                        [101040022094]
33  [F161B5, F17D86, F17D8D, F1825C, F1825A, F1825D]  [101040026976, 101040026976, 101040026976, 101040026976, 101040026976, 101040026976]

撰写回答