我对熊猫还很陌生,所以请原谅我是否已存在要执行的功能,或者我打算用错误的方式进行操作。
此刻我正在使用两个数据帧:
df_xmlTxt(index = ['curid','title','text','cat'])
df_xmlCategories(index = ['curid','cat_1','cat_2',...,'cat_n'] )
cat是指类别,其中df_xmlTxt中每一行的“ cat”值都是类别列表。
我想将df_xmlCategories数据帧填充到每个类别列的每一行都具有true / false值的地方。
我已经写了一些我认为可以解决问题的代码,但是我遇到了错误。到目前为止,df_xmlCategories是其他数据框的ID列以及附加到此列的类别(其中每个类别列的值为0)的副本。这是最后一行不起作用,我需要更改
# Create categories dataframe for all articles and populate
df_xmlCategories = df_xmlTxt[['curid']].copy()
cat = dict.fromkeys(getAllCats(), 0)
df_xmlCategories = df_xmlCategories.assign(**cat)
# Update all boolean values for every categorys
df_xmlCategories = [[df_xmlCategories.loc[j][curId] = 1 for j in (df_xmlTxt.loc['cat'][curId].values.tolist())] for curId in df_xmlCategories['curId']]
任何建议/不同的处理方式将不胜感激
修改: 为了清楚起见,两个表如下所示: df_xmlTxt
我的目标是为该行的curID属于该类别的所有单元格提供一个真实的布尔值
答案 0 :(得分:0)
因此,首先需要将cat
列表分成几行。
我使用了零的答案here。
d = {'curid': [1,3,5], 'cat': [['cat_1','cat_2'],
['cat_2','cat_3','cat_4'],
['cat_1','cat_3']]}
df_xmlTxt = pd.DataFrame(data=d)
df_xmlTxt = df_xmlTxt.set_index('curid')
df_xmlTxt = df_xmlTxt.cat.apply(pd.Series)
.stack()
.reset_index(level=1,drop=True)
.to_frame('cat')
您最终得到这个:
cat
curid
1 cat_1
1 cat_2
3 cat_2
3 cat_3
3 cat_4
5 cat_1
5 cat_3
您添加了一个虚拟变量value
用于pivot
。
df_xmlTxt['value'] = 1
df_xmlCategories = df_xmlTxt.pivot(columns='cat', values='value')
然后您通过取反False
将空单元格转换为True
,而不将空单元格转换为isnull
~df_xmlCategories.isnull()
cat cat_1 cat_2 cat_3 cat_4
curid
1 True True False False
3 False True True True
5 True False True False
编辑:考虑到cat
是类别列表。