Pandas:将一列的列表大小与另一列相同
我有两列数据:serial_number
和 inv_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
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]