我有一个数据帧,其结构如下
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=1
,col3
中的条目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