python - 扩展 pandas DataFrame 列中的整数范围
问题描述
我有一个看起来像这样的数据框:
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)
推荐阅读
- android - 如何通过与另一点的距离和方向计算一个点的纬度和经度
- android - 如何在 android 应用程序中使共享首选项全局可用?
- javascript - 直接发布到 Facebook 没有共享对话框问题
- arrays - “如何从 Ruby 数组中删除一个元素,该元素只是另一个元素的反转?”
- php - PHP 生成器:即使调用了 break,如何始终清理资源?
- mysql - COUNT(*) 附近的语法不正确
- python - 基于正则表达式拆分列的模式
- c++ - QT label setText() 同时保留文本格式
- html - django中的提交按钮刷新页面而不保存
- java - Sonarqube - 使用 Lombok @data 删除这个未使用的私有字段 Code Smell