在Python中将类别列转换为一个字符串列

时间:2017-10-03 09:17:58

标签: python pandas categories

这是对先前提出的问题的跟进(由我问:):Oneliner to create string column from multiple columns

我想将数据框中的子集列合并到new中创建新的字符串列。 @Zero非常友好地为我提供了解决这个问题的方法

import pandas as pd

df = pd.DataFrame({'gender' : ['m', 'f', 'f'],\
                   'code' : ['K2000', 'K2000', 'K2001']})


col_names = df.columns
df_str = df[col_names].astype(str).apply('_'.join, axis=1)
df_str
Out[17]: 
0       K2000_m
1       K2000_f
2       K2001_f
dtype: object

但是如果我引入间隔数据则失败

df = pd.DataFrame({'gender' : ['m', 'f', 'f'],\
                   'code' : ['K2000', 'K2000', 'K2001'],\
                   'num' : pd.cut([3, 6, 9], [0, 5, 10])})
col_names = df.columns
df_str = df[col_names].astype(str).apply('_'.join, axis=1)

理想情况下,我还希望将数据转换为分类数据(也会失败)

df_cat = pd.concat([df['gender'].astype('category'), \
                    df['code'].astype('category'), \
                    df['num'].astype('category')], axis=1)
df_cat_str = df_cat[col_names].astype(str).apply('_'.join, axis=1)

这里发生了什么?我怎样才能实现所需的输出

0   K2000_m_(0, 5]
1  K2000_f_(5, 10]
2  K2001_f_(5, 10]

与前一个问题一样,col_names应该是一个包含列的任何子集的列表(不一定是本例中的所有列)

1 个答案:

答案 0 :(得分:1)

您需要在lambda函数中将每列分别转换为str

df_str = df[col_names].apply(lambda x: '_'.join(x.astype(str)), axis=1)
print (df_str)
0     K2000_m_(0, 5]
1    K2000_f_(5, 10]
2    K2001_f_(5, 10]
dtype: object