首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建范围从顺序值,同时维护熊猫的其他列。

创建范围从顺序值,同时维护熊猫的其他列。
EN

Stack Overflow用户
提问于 2022-05-22 20:39:33
回答 1查看 64关注 0票数 1

我试图找到一种方法来巩固顺序(连续的?)按另一列分组的范围内的数字。

我已经尝试过tried解析器和迭代工具,但是我还不够聪明,无法实现它们来获得我想要的结果。寻求一些帮助和/或想法。谢谢!

输入:

代码语言:javascript
复制
| 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。

代码语言:javascript
复制
| 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        |

样本输入数据:

代码语言:javascript
复制
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}})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-22 23:02:25

如何将相等的邻居按列分组

试验数据

代码语言:javascript
复制
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.

  • Split numpy.vsplit.

  • join

  • 查找在test_var中的值与以前的test_var值不同的索引,这些索引中的数据垂直地使用numpy.vsplit.

  • join min/max值跨前一组中感兴趣的列。

代码语言:javascript
复制
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)

输出

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72341141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档