Python/Pandas -生成解析的分类(二进制)变量的所有可能组合

gr8qqesn  于 2023-08-01  发布在  Python
关注(0)|答案(2)|浏览(101)

我有一个数据集,大致采用这种简化形式:

id       Fan    Pos
10001   32.83   A/B
10005   71.60   A/B
10010   24.23   E/F
10011   48.81   G/H

字符串
我需要“解包”Pos变量,并生成n个不同版本的数据集,其中包含解析的Pos变量的所有可能组合。最后的结果需要是一个Pandas df类似于这样的东西:

Set   id    Fan    Pos
1   10001   32.83   A
1   10005   71.60   A
1   10010   24.23   E
1   10011   48.81   G
2   10001   32.83   A
2   10005   71.60   A
2   10010   24.23   E
2   10011   48.81   H
.   .          .    .
.   .          .    .
.   .          .    .
16  10001   32.83   B
16  10005   71.60   B
16  10010   24.23   F
16  10011   48.81   H


在这种情况下,4行中有2^4 = 16个Pos变量的唯一组合(见下文)。请注意,上面的每个Set都是下面列出的16种Pos变量组合中的1种。
问题是,这个过程将重复发生,行数将发生变化,这当然意味着组合的数量将发生变化(2^nrows =?未来)。
我的第一个想法是硬编码一系列循环来实现这一点,但由于行数在将来会发生变化,因此循环的数量必须动态地链接到行数。
有人能提出一个更有效的方法来实现这一目标吗?

qnyhuwrf

qnyhuwrf1#

如果我理解正确的话,你可以使用itertools.product

from itertools import product

combs = df.apply(lambda x: [(x.name, c) for c in x['Pos'].split('/')], axis=1)

df_out = pd.Series(product(*combs)).explode().to_frame().reset_index()
df_out.index, df_out[0] = df_out[0].str[0], df_out[0].str[1]

df_out = pd.merge(df, df_out, left_index=True, right_index=True).sort_values(by=['index', 0])

df_out = df_out.rename(columns={'index': 'Set', 0: 'Pos'})
df_out['Set'] += 1
print(df_out[['Set', 'id', 'Fan', 'Pos']])

字符串
图纸:

Set     id    Fan  Pos Pos
0    1  10001  32.83  A/B   A
1    1  10005  71.60  A/B   A
2    1  10010  24.23  E/F   E
3    1  10011  48.81  G/H   G
0    2  10001  32.83  A/B   A
1    2  10005  71.60  A/B   A
2    2  10010  24.23  E/F   E
3    2  10011  48.81  G/H   G
0    3  10001  32.83  A/B   A
1    3  10005  71.60  A/B   A

...

lokaqttq

lokaqttq2#

另一种可能的解决方案:

from itertools import product

d = df['Pos'].str.split('/', expand=True).T

pd.concat([df[['id', 'Fan']].assign(Pos=x)
          for x in product(*[d[col] for col in d.columns])])

字符串
输出量:

id    Fan Pos
0   10001  32.83   A
1   10005  71.60   A
2   10010  24.23   E
3   10011  48.81   G
0   10001  32.83   A
..    ...    ...  ..
3   10011  48.81   G
0   10001  32.83   B
1   10005  71.60   B
2   10010  24.23   F
3   10011  48.81   H

[64 rows x 3 columns]

相关问题