gpt4 book ai didi

python - 扩展 pandas DataFrame 列中的整数范围

转载 作者:行者123 更新时间:2023-12-01 01:21:14 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

d = {'value': ['a','b','c','d','e','f','g', 'h'],\
'id' : ['0101', '0208', '0103', '0405', '0105,0116,0117',
'0108-0110', '0231, 0232, 0133-0150', '0155, 0152-0154, 0151']}
df = pd.DataFrame(d)
>>>
value id
0 a 0101
1 b 0208
2 c 0103
3 d 0405
4 e 0105
5 e 0116
6 e 0117
7 f 0108
8 f 0109
9 f 0110
10 g 0231, 0232, 0133-0150
11 h 0155, 0152-0154, 0151

但我需要扩展这些 ID,以便每一行都是一个数字,因此它看起来更像:

   value    id
0 a 0101
1 b 0208
2 c 0103
3 d 0405
4 e 0105
5 e 0116
6 e 0117
7 f 0108
8 f 0109
9 f 0110
10 g ...

其中每行在 ID 分组的地方重复(扩展范围,并为小于 4 位的 ID 保留前导零)。

我已经做到了

df['id'].str.split(",")
df['id'].str.contains("-")

但我想不出一个好的方法来做到这一点。有人可以帮忙吗?

最佳答案

您可以编写一个小例程来展平范围,然后根据需要重复原始值。

from itertools import chain

flattened = []
for x in df['id'].str.split(r',\s*'):
flattened.append([])
for y in x:
if '-' in y:
start, end = pd.to_numeric(y.split('-'))
flattened[-1].extend(pd.RangeIndex(start, end+1))
else:
flattened[-1].append(int(y))

repeats = [len(f) for f in flattened]

df_flat = pd.DataFrame({
'value': df.value.repeat(repeats).values,
'id': list(chain.from_iterable(flattened))})
df_flat.tail(10)

value id
25 g 146
26 g 147
27 g 148
28 g 149
29 g 150
30 h 155
31 h 152
32 h 153
33 h 154
34 h 151
<小时/>

事实证明,即使对于较大的数据,这也具有相当好的性能。

df_ = df
df = pd.concat([df_] * 1000, ignore_index=True)

%timeit flatten(df) # Function running code above.
244 ms ± 15.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 扩展 pandas DataFrame 列中的整数范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53813442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com