【问题标题】:pandas.DataFrame - how to reindex by group?pandas.DataFrame - 如何按组重新索引?
【发布时间】:2013-02-28 05:23:18
【问题描述】:

可以将新索引应用于DF,分别应用于groupby 的分组吗?准确地说 - 有没有一种优雅的方法可以做到这一点,并且可以通过 groupby 组更改原始 DF 吗?

更新: 我的数据如下所示:

   A  B         C
0  a  x  0.903343
1  a  z  0.982050
2  g  x  0.274823
3  g  y  0.334491
4  c  z  0.756728
5  f  z  0.697841
6  d  z  0.505845
7  b  z  0.768199
8  b  y  0.743012
9  e  x  0.697212

我按列“A”和“B”分组,并且我希望该列的每对唯一值在原始 DF 中都具有相同的索引值。另外 - 原始 DF 可能很大,我试图弄清楚如何在不低效地形成全新 DF 的情况下制作这样的重新索引。

目前我正在使用这个解决方案:

df = pd.DataFrame({'A': [random.choice(ascii_lowercase[:5]) for _ in xrange(10)],
                    'B': [random.choice(['x', 'y']) for _ in xrange(10)],
                    'C': [random.random() for _ in xrange(10)]})

df['id'] = None
new_df = pd.DataFrame()
for i, (n, g) in enumerate(df.groupby(['A', 'B'])):
    g['id'] = i
    new_df = new_df.append(g)

new_df.set_index('id', inplace=True)

【问题讨论】:

  • 如果您提供一些示例数据会很方便。
  • 此外,您可以澄清一些歧义。您要修改组名吗?组内选定的行索引?如果您可以显示起始 df、groupby 以及您尝试完成的重新索引类型,那将会很有帮助。
  • 如果我理解正确,您似乎正在尝试为 A 列和 B 列的每个组合创建一个具有唯一值的整数索引。除非您出于特定原因需要整数索引,否则您可以简单地创建使用带有df.set_index(["A", "B"]).sort() 的A 和B 列的MultiIndex,这将允许您使用xsix 执行所有相同的选择和切片整数索引。示例:df.ix["a"].ix["y"]df.xs(key="x", level=1)

标签: python pandas


【解决方案1】:

您可以使用 pandas 中的一些内部函数快速完成此操作:

先创建测试DataFrame:

import pandas as pd
import random
random.seed(1)
df = pd.DataFrame({'A': [random.choice(ascii_lowercase[:5]) for _ in xrange(10)],
                    'B': [random.choice(['x', 'y']) for _ in xrange(10)],
                    'C': [random.random() for _ in xrange(10)]})

如果您希望新 id 与列 A 和 B 的顺序相同:

m = pd.MultiIndex.from_arrays((df.A, df.B))
df.index = pd.factorize(pd.lib.fast_zip(m.labels), sort=True)[0]
print df

输出是:

   A  B         C
1  a  y  0.025446
7  e  x  0.541412
6  d  y  0.939149
2  b  x  0.381204
3  c  x  0.216599
4  c  y  0.422117
5  d  x  0.029041
6  d  y  0.221692
1  a  y  0.437888
0  a  x  0.495812

如果你不关心新id的顺序:

m = pd.MultiIndex.from_arrays((df.A, df.B))
la, lb = m.labels
df.index = pd.factorize(la*len(lb)+lb)[0]
print df

输出是:

  A  B         C
0  a  y  0.025446
1  e  x  0.541412
2  d  y  0.939149
3  b  x  0.381204
4  c  x  0.216599
5  c  y  0.422117
6  d  x  0.029041
2  d  y  0.221692
0  a  y  0.437888
7  a  x  0.495812

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2018-01-29
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多