如何将行字符串值转换为要素

时间:2017-02-13 05:04:38

标签: python python-3.x pandas dataframe reshape

我有一个类似下面的数据框。它具有ID列和每个客户的产品历史记录。

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

我希望将产品转换为功能(列),而不是为每个客户列出产品,以便数据框看起来像这样。

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

我尝试使用get_dummies函数,但是,这会将不同的列呈现为1-A,1-E,1-F,2-B,2-C ......等等,这不是我需要的。< / p>

有关完成此任务的任何建议。

2 个答案:

答案 0 :(得分:2)

这将产生您想要的数据帧。

df = pd.get_dummies(df.set_index('ID').T.unstack()).groupby(level=0).sum().astype(int)

print (df)

输出:

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

答案 1 :(得分:2)

您可以使用get_dummies并与max汇总:

print (pd.get_dummies(df.set_index('ID'), prefix_sep='', prefix='')
         .groupby(axis=1, level=0).max())

或者:

print (pd.get_dummies(df.set_index('ID').stack())
         .groupby(level=0).max().astype(int))

您可以使用自定义功能,但速度很慢:

df = df.set_index('ID').apply(lambda x: pd.Series(dict(zip(x, [1]*len(df.columns)))), axis=1)
       .fillna(0)
       .astype(int)
print (df)
    A  B  C  D  E  F
ID                  
1   1  1  1  1  0  0
2   0  1  1  1  1  0
3   0  1  1  1  0  1

我很喜欢时间

np.random.seed(123)
N = 10000
L = list('ABCDEFGHIJKLMNOPQRST')
#[10000 rows x 20 columns]
df = pd.DataFrame(np.random.choice(L, size=(N,5)))
df = df.rename_axis('ID').reset_index()
print (df.head())

#Alex Fung solution
In [160]: %timeit (pd.get_dummies(df.set_index('ID').T.unstack()).groupby(level=0).sum().astype(int))
10 loops, best of 3: 27.9 ms per loop

In [161]: %timeit (pd.get_dummies(df.set_index('ID').stack()).groupby(level=0).max().astype(int))
10 loops, best of 3: 26.3 ms per loop

In [162]: %timeit (pd.get_dummies(df.set_index('ID'), prefix_sep='', prefix='').groupby(axis=1, level=0).max())
10 loops, best of 3: 26.4 ms per loop

In [163]: %timeit (df.set_index('ID').apply(lambda x: pd.Series(dict(zip(x, [1]*len(df.columns)))), axis=1).fillna(0).astype(int))
1 loop, best of 3: 3.95 s per loop