0

我有一个看起来像这样的列:

             ID    len                                        range_cover
0    A0A075B734  347.0                                [36, 134, 136, 283]
1    A0A087X1C5  515.0                                [22, 328, 347, 514]
2    A0A1B0GTQ1  446.0                                [22, 116, 168, 496]
3    A0A1W2PN81  502.0    [22, 46, 48, 117, 119, 149, 152, 160, 162, 230]
4        Q494W8  412.0  [22, 36, 80, 84, 88, 91, 96, 128, 131, 139, 14...
..          ...    ...                                                ...
165      Q9UQ90  795.0                                         [303, 564]
166      Q9Y210  931.0                                           [0, 930]


而且我想将列表range_cover按成对的数字划分,但我不知道该怎么做。所有列表都可以被二整除,所以这对所有列表都是可能的。
这是预期的输出:

                                                 range_cover
                                     [[36, 134], [136, 283]]
                                     [[22, 328], [347, 514]]
                                     [[22, 116], [168, 496]]
   [[22, 46], [48, 117], [119, 149], [152, 160], [162, 230]]
[[22, 36], [80, 84], [88, 91], [96, 128], [131, 139], [14...
...
                                                   [303, 564]
                                                     [0, 930]

我考虑过使用 zip,例如:

df2['tup'] = df2.apply(lambda x: list(zip(x.range_cover)), axis=1)

但我不知道如何告诉函数将第一个数字与第二个数字“压缩”,依此类推。我也想过使用 .replace,但我需要该函数每 2 个数字替换一个字符。

欢迎任何帮助或建议!干杯

4

2 回答 2

3

numpy reshape()是一个简单的解决方案

import json
df = pd.read_csv(io.StringIO("""             ID    len                                        range_cover
0    A0A075B734  347.0                                [36, 134, 136, 283]
1    A0A087X1C5  515.0                                [22, 328, 347, 514]
2    A0A1B0GTQ1  446.0                                [22, 116, 168, 496]
3    A0A1W2PN81  502.0    [22, 46, 48, 117, 119, 149, 152, 160, 162, 230]"""), sep="\s\s+", engine="python")

df["range_cover"] = df["range_cover"].apply(json.loads)
df["range_cover"].apply(lambda l: np.array(l).reshape(len(l)//2, 2))
于 2021-04-23T19:04:30.820 回答
1

通过transform()和列表理解:

df['range_cover'].transform(lambda x: [x[i:i+2] for i in range(0,len(x),2)])

0                              [[36, 134], [136, 283]]
1                              [[22, 328], [347, 514]]
2                              [[22, 116], [168, 496]]
3    [[22, 46], [48, 117], [119, 149], [152, 160], ...
于 2021-04-23T19:12:02.383 回答