重新映射和重新组合python pandas中的值

时间:2018-07-26 10:44:59

标签: python pandas

我有一个数据框,其中值已分配给组:

import pandas as pd

df = pd.DataFrame({ 'num' : [0.43, 5.2, 1.3, 0.33, .74, .5, .2, .12],
                   'group' : [1, 2, 2, 2, 3,4,5,5]
                    })

df

  group num
0   1   0.43
1   2   5.20
2   2   1.30
3   2   0.33
4   3   0.74
5   4   0.50
6   5   0.20
7   5   0.12

我想确保没有一个单独的价值。如果值是“孤立”,则应将其重新分配给成员多于一个的下一个最高组。因此,结果数据框应如下所示:

  group num
0   2   0.43
1   2   5.20
2   2   1.30
3   2   0.33
4   5   0.74
5   5   0.50
6   5   0.20
7   5   0.12

达到此结果的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

这是我发现的一种解决方案,可能有更好的方法来实现此目的...

# Find the orphans
count = df.group.value_counts().sort_index()
orphans = count[count == 1].index.values.tolist()

# Find the sets
sets = count[count > 1].index.values.tolist()

# Find where orphans should be remapped
where = [bisect.bisect(sets, x) for x in orphans]
remap = [sets[x] for x in where]

# Create a dictionary for remapping, and replace original values
change = dict(zip(orphans, remap))
df = df.replace({'group': change})

df

  group num
0   2   0.43
1   2   5.20
2   2   1.30
3   2   0.33
4   5   0.74
5   5   0.50
6   5   0.20
7   5   0.12

答案 1 :(得分:1)

对此任务只能使用向量化操作。您可以使用pd.Series.bfill创建从原始索引到新索引的映射:

counts = df['group'].value_counts().sort_index().reset_index()
counts['original'] = counts['index']
counts.loc[counts['group'] == 1, 'index'] = np.nan
counts['index'] = counts['index'].bfill().astype(int)

print(counts)

   index  group  original
0      2      1         1
1      2      3         2
2      5      1         3
3      5      1         4
4      5      2         5

然后使用pd.Series.map执行映射:

df['group'] = df['group'].map(counts.set_index('original')['index'])

print(df)

   group   num
0      2  0.43
1      2  5.20
2      2  1.30
3      2  0.33
4      5  0.74
5      5  0.50
6      5  0.20
7      5  0.12