Python pandas.DataFrame-如何按组重新编制索引?
新索引是否可以分别应用于使用Python pandas.DataFrame-如何按组重新编制索引?,python,pandas,Python,Pandas,新索引是否可以分别应用于使用groupby进行的分组?准确地说-是否有一种优雅的方法可以做到这一点,并且可以通过groupbygroups更改原始DF UPD: 我的数据如下所示: 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.7681
groupby
进行的分组?准确地说-是否有一种优雅的方法可以做到这一点,并且可以通过groupby
groups更改原始DF
UPD:
我的数据如下所示:
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)
您可以使用pandas中的一些内部功能快速执行此操作: 首先创建测试数据帧:
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
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
如果您不关心新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
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
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
如果你能提供一些样本数据,那会很方便。另外,这里有一些含糊不清的地方,你可以澄清一下。是否要修改组名?组中选定的行索引?如果您可以显示起始df、groupby以及您试图完成的重新索引类型,这将非常有用。如果我理解正确,您似乎正在尝试为a列和B列的每个组合创建具有唯一值的整数索引。除非您出于特定原因需要整数索引,您只需使用a列和B列以及
df.set_index([“a”,“B”]).sort()
创建一个多索引,这将允许您使用xs
和ix
执行所有相同的选择和切片整数索引。示例:df.ix[“a”].ix[“y”]
或df.xs(key=“x”,level=1)
。