Apply在Pandas中获得两个新专栏

Apply在Pandas中获得两个新专栏

我有DF看起来像:

Name                 Item
A,D,B,B,C,C      I1,I2,I3,I1,I2
X,Y,Z,Z,Z            I4,I1,I1,I88,I4


预期产量:

Name            Item         Unique_Name  Unique_Item Count_Unique_name  Count_Unique_Item
A,D,B,B,C,C  I1,I2,I3,I1,I2    A,B,C,D      I1,I2,I3         4             3
X,Y,Z,Z,Z   I4,I1,I1,I88,I4    X,Y,Z       I4,I1,I88         3             4


码:

new_items_df['Unique_Name'] = new_items_df['Name'].apply(lambda x: set(x.lower().split(",")))
new_items_df['Unique_Item'] = new_items_df['Item'].apply(lambda x: set(x.lower().split(",")))
new_items_df['Count_Unique_Name'] = new_items_df['Unique_Modifier'].apply(lambda x: len(x))
new_items_df['Count_Unique_Item'] = new_items_df['Unique_Item'].apply(lambda x: len(x))


上面的代码工作正常,但我正在执行相同的操作,并且两次运行相同的代码。当我尝试合并第一两行代码时,如下所示:

new_items_df[['Unique_Name','Unique_Item']] = new_items_df[['Name','Item']].apply(lambda x: set(x.str.lower().str.split(",")),axis =1)



  TypeError :(“无法散列的类型:'列表'”,“发生在索引0”)


我也尝试使用.unique(),尝试通过使用[]将其转换为列表,但似乎无济于事,我遇到一个错误或另一个错误

总结:

所以,我可以将我的4行代码合并为1行吗?

最佳答案

您可以使用applymap处理标量:

c = ['Name','Item']
#python 3.6+ solution
c1 = [f'Unique_{x}' for x in c]
c2 = [f'Count_Unique_{x}' for x in c]
#python bellow 3.6
#c1 = ['Unique_{}'.format(x) for x in c]
#c2 = ['Count_Unique_{}'.format(x) for x in c]

new_items_df[c1] = new_items_df[c].applymap(lambda x: set(x.lower().split(",")))
new_items_df[c2] = new_items_df[c1].applymap(len)

print (new_items_df)
              Name             Item   Unique_Name    Unique_Item  \
0  A,A,A,B,B,B,C,D   I1,I2,I3,I1,I2  {c, b, d, a}   {i1, i2, i3}
1        X,Y,Z,Z,Z  I4,I1,I1,I88,I4     {y, x, z}  {i1, i4, i88}

   Count_Unique_Name  Count_Unique_Item
0                  4                  3
1                  3                  3

关于python - Lambda + Apply在Pandas中获得两个新专栏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53593811/

10-11 22:48