2016-07-20 51 views
2

问题设置串联其他唯一列的所有可能的列值

假设我给出下面的数据帧。

ID category 
223 MMO 
223 Game 
444 Finance 
360 Reading 
360 Book 

该数据帧具有一个ID柱和它的相关联的category。请注意,相同的ID可以有多个类别。

我的目标是创建一个新列,其中包含给定ID的所有可能类别的连接。这意味着:

  • 移除旧category
  • 删除重复ID

的输出是这样的。

ID category 
223 MMO_Game  
444 Finance  
360 Reading_Book 

尝试性解决方案

我的思想过程是先创建一个GROUPBY变量将由IDcategory

groupby_ID = df['category'].groupby(df['ID']) 

现在我可以尝试遍历分组数据并连接字符串。

for ID, category in groupby_appID: 

我不知道该怎么继续下去。一些指针将不胜感激!

回答

4

您可以groupby的ID,然后申请一个join与所需的分隔符:

In [142]: 
df.groupby('ID')['category'].apply('_'.join) 

Out[142]: 
ID 
223  MMO_Game 
360 Reading_Book 
444   Finance 
Name: category, dtype: object 

得到确切所需的输出,你可以调用reset_indexname PARAM:

In [145]: 
df.groupby('ID')['category'].apply('_'.join).reset_index(name='category') 

Out[145]: 
    ID  category 
0 223  MMO_Game 
1 360 Reading_Book 
2 444  Finance 
+0

天才@EdChum!我想我推翻了这个问题,不需要循环。 –

+1

你可以做到这一点并不明显,它很容易开始使用lambda或某种内置方法,但它是一个很好的实现你想要的方式 – EdChum

+1

我看到@EdChum已经回答,我不想要他的影响我的答案。所以我没有看。我在功能上提出了相同的解决方案,但这更优雅。 'df.groupby('ID')。category.apply(lambda x:'_'。join(x))''。很好的答案@EdChum。 – piRSquared

相关问题