我试图找到一种方法来巩固顺序(连续的?)按另一列分组的范围内的数字。
我已经尝试过tried解析器和迭代工具,但是我还不够聪明,无法实现它们来获得我想要的结果。寻求一些帮助和/或想法。谢谢!
输入:
| test_var | F1 |
|------------|------|
| ABC | 1 |
| ABC | 2 |
| DEF | 3 |
| ABC | 4 |
| ABC | 5 |
| GHI | 1 |
| GHI | 2 |
| ABC | 6 |目标产出:
F1_range应该表示每个test_var顺序值的最小和最大。其中可能有几组。
一个简单的例子是"GHI“。对于F1,只有1组顺序值,1-2.
一个更复杂的例子是"ABC",它有2组序列值1-2和4-6。
| test_var | F1 | F1_range |
|------------|------|------------|
| ABC | 1 | 1-2 |
| ABC | 2 | 1-2 |
| DEF | 3 | 3 |
| ABC | 4 | 4-6 |
| ABC | 5 | 4-6 |
| GHI | 1 | 1-2 |
| GHI | 2 | 1-2 |
| ABC | 6 | 4-6 |样本输入数据:
df = pd.DataFrame(data={'test_var': {0: 'ABC',
1: 'ABC',
2: 'DEF',
3: 'ABC',
4: 'ABC',
5: 'GHI',
6: 'GHI',
7: 'ABC'},
'F1': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 1, 6: 2, 7: 6}})发布于 2022-05-22 23:02:25
如何将相等的邻居按列分组
试验数据
df = pd.DataFrame({
'test_var': ['ABC', 'ABC', 'DEF', 'ABC', 'ABC', 'ABC', 'GHI', 'GHI'],
'F1': [1, 2, 3, 4, 6, 5, 1, 2],
'F2': [10, 11, 1, 13, 16, 14, 2, 1]
})我们假设索引是从步骤1的0开始的普通RangeIndex。
主要步骤
neighbors.
numpy.vsplit.
join
numpy.vsplit.
join min/max值跨前一组中感兴趣的列。。
columns = ['F1','F2']
ranges = [f'{name}_range' for name in columns]
df[ranges] = ''
test_var = df['test_var'].values
changed = np.zeros(len(df), dtype=np.bool)
changed[1:] = test_var[1:] != test_var[:-1]
groups = np.vsplit(df, df.index[changed])
sep = '-'
def get_range(index, column):
data = df.loc[index, column]
low, high = min(data), max(data)
return f'{low}-{high}' if low < high else str(low)
for gr in groups:
for col, rng in zip(columns, ranges):
df.loc[gr.index, rng] = get_range(gr.index, col)输出

https://stackoverflow.com/questions/72341141
复制相似问题