groupby之后pandas数据帧列的相同混洗



我有一个数据帧,其结构如下

ID  col2    col3
1   101001  a
1   101001  b
1   101001  c
1   101002  a
1   101002  b
1   101002  c
1   101003  a
1   101003  b
1   101003  c
1   101004  a
1   101004  b
1   101004  c
2   101001  a
2   101001  b
2   101001  d
2   101002  a
2   101002  b
2   101002  d
2   101003  a
2   101003  b
2   101003  d
2   101004  a
2   101004  b
2   101004  d
3   101001  b
3   101001  c
3   101001  d
3   101002  b
3   101002  c
3   101002  d
3   101003  b
3   101003  c
3   101003  d
3   101004  b
3   101004  c
3   101004  d

我需要按列ID进行分组,为每个相应的ID重新排列列col3中的条目,并将结果写入新的列col4中。此外,对于给定的ID,混洗应该是相同的,独立于col2中的条目,例如对于ID=1col3中的条目a在混洗后应该始终是b

ID  col2    col3    col4
1   101001  a   b
1   101001  b   a
1   101001  c   c
1   101002  a   b
1   101002  b   a
1   101002  c   c
1   101003  a   b
1   101003  b   a
1   101003  c   c
1   101004  a   b
1   101004  b   a
1   101004  c   c
2   101001  a   d
2   101001  b   a
2   101001  d   b
2   101002  a   d
2   101002  b   a
2   101002  d   b
2   101003  a   d
2   101003  b   a
2   101003  d   b
2   101004  a   d
2   101004  b   a
2   101004  d   b
3   101001  b   b
3   101001  c   d
3   101001  d   c
3   101002  b   b
3   101002  c   d
3   101002  d   c
3   101003  b   b
3   101003  c   d
3   101003  d   c
3   101004  b   b
3   101004  c   d
3   101004  d   c

在我的情况下,使用df['col4'] = test_df.groupby('ID')['col3'].transform(np.random.permutation)在panda数据帧中使用group来跟随Shuffle列是不起作用的,因为由于col2中的条目不同,打乱的结果在给定的ID内也不同。

from random import sample
def f(ser):
elements = list(set(ser))
replacements = sample(elements, len(elements))
return ser.replace(elements, replacements)
df['col3'] = df.groupby('ID')['col2'].transform(f)

示例:

df = pd.DataFrame({'ID': [1, 1, 1, 1, 1, 2, 2, 2, 2],
'col2': ['a', 'b', 'a', 'c', 'b', 'a', 'f', 'a', 'f']})

结果:

ID col2 col3
0   1    a    a
1   1    b    c
2   1    a    a
3   1    c    b
4   1    b    c
5   2    a    f
6   2    f    a
7   2    a    f
8   2    f    a

相关内容

  • 没有找到相关文章

最新更新