gpt4 book ai didi

python - 将列拆分为多列,在 Pandas 中具有唯一值

转载 作者:行者123 更新时间:2023-12-05 08:45:41 25 4
gpt4 key购买 nike

我有以下数据框:

   Col
0 A,B,C
1 B,A,D
2 C
3 A,D,E,F
4 B,C,F
df = pd.DataFrame({'Col': ['A,B,C', 'B,A,D', 'C', 'A,D,E,F', 'B,C,F']})

需要变成:

   A B C D E F
0 A B C
1 A B D
2 C
3 A D E F
4 B C F

最佳答案

您可以使用 str.get_dummies 获取虚拟变量,然后与列相乘:

tmp = df['Col'].str.get_dummies(sep=',')
out = tmp * tmp.columns

@piRSquared 建议的单行代码:

out = df.Col.str.get_dummies(',').pipe(lambda d: d*[*d])

输出:

   A  B  C  D  E  F
0 A B C
1 A B D
2 C
3 A D E F
4 B C F

基准:

关于通过复制 OP 中的数据创建的数据:

enter image description here

@piRSquared's first method使用 numpy 方法是最快的解决方案。


在随机生成的大小不断增加的 DataFrame 上:

enter image description here

重现情节的代码:

import perfplot
import pandas as pd
import numpy as np

def enke(df):
tmp = df['Col'].str.get_dummies(sep=',')
return tmp * tmp.columns

def mozway(df):
return pd.concat([pd.Series((idx:=x.split(',')), index=idx)
for x in df['Col']], axis=1).T.fillna('')

def piRSquared(df):
n = df.shape[0]
i = np.repeat(np.arange(n), df.Col.str.count(',')+1)
c, j = np.unique(df.Col.str.cat(sep=',').split(','), return_inverse=True)
m = c.shape[0]
a = np.full((n, m), '')
a[i, j] = c[j]
return pd.DataFrame(a, df.index, c)

def piRSquared2(df):
n = df.shape[0]
base = df.Col.to_numpy().astype(str)
commas = np.char.count(base, ',')
sepped = ','.join(base).split(',')
i = np.repeat(np.arange(n), commas+1)
c, j = np.unique(sepped, return_inverse=True)
m = c.shape[0]
a = np.full((n, m), '')
a[i, j] = c[j]
return pd.DataFrame(a, df.index, c)

def constructor1(n):
df = pd.DataFrame({'Col': ['A,B,C', 'B,A,D', 'C', 'A,D,E,F', 'B,C,F']})
return pd.concat([df]*n, ignore_index=True)

def constructor2(n):
uc = np.array([*ascii_uppercase])
k = [','.join(np.random.choice(uc, x, replace=False))
for x in np.random.randint(1, 10, size=n)]
return pd.DataFrame({'Col': k})

kernels = [enke, piRSquared, piRSquared2, mozway]
df = pd.DataFrame({'Col': ['A,B,C', 'B,A,D', 'C', 'A,D,E,F', 'B,C,F']})

perfplot.plot(
setup=constructor1,
kernels=kernels,
labels=[func.__name__ for func in kernels],
n_range=[2**k for k in range(15)],
xlabel='len(df)',
logx=True,
logy=True,
relative_to=0,
equality_check=pd.DataFrame.equals)

关于python - 将列拆分为多列,在 Pandas 中具有唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71862328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com