熊猫数据框-创建新的列表列,其中包括来自分组列

时间:2020-05-11 20:54:53

标签: python pandas

我一直在努力挣扎,感觉有点卡住。

我有一个由这样的数据组成的数据框,名为merged_frames(它是一个单帧,是通过将少数几个相同形状的帧连接起来而创建的):

          fqdn               source
0         site1.org          public_source_a
1         site2.org          public_source_a
2         site3.org          public_source_a
3         site1.org          public_source_b
4         site4.org          public_source_b
5         site1.org          public_source_b
6         site4.org          public_source_d                                 ...                 
7         site1.org          public_source_c
...

我想做的是在此框架中创建一个新列,其中包含按fqdn值分组时的源列表(理想情况是Python列表,而不是命令分隔字符串)。例如,根据此示例数据,为fqdnsite1.org生成的数据应看起来像这样(这只是我期望的一部分,其他{{ 1}}值)

fqdn

一旦我获得了这种形式的数据,我将简单地删除fqdn source_list source site1.org [public_source_a, public_source_b, public_source_c] public_source_a site1.org [public_source_a, public_source_b, public_source_c] public_source_b site1.org [public_source_a, public_source_b, public_source_c] public_source_c site1.org [public_source_a, public_source_b, public_source_c] public_source_d 列,然后使用source除去除一个以外的所有内容。

我挖了一些旧代码,两年前我曾经做过类似的事情,但是它并没有按我预期的那样工作。自从我对Pandas做过类似的事情已经有一段时间了。我的经历大致是:

drop_duplicates(keep='first')

这表现得很奇怪。尽管实际上是将 merged_frame['source_list'] = merged_frame.groupby( 'fqdn', as_index=False)[['source']].aggregate( lambda x: list(x))['source'] 创建为列表/数组,但该列中的数据不正确。此外,相当多的source_list值具有fqdn的null / NaN值

我觉得我需要采取完全不同的方式。对此,我们会有所帮助,尽管我认为这是我在相似数据集上使用的非常相关的示例代码块,但我现在已被完全阻止,并且没有任何进展。

编辑:

我仅从基础开始就取得了一些进步,并且具有以下内容,尽管这将字符串连接在一起而不是将它们列出来:

source_list

我敢肯定,只需在这里使用 merged_frame['source_list'] = merged_frame.groupby('fqdn').source.transform(','.join) 就可以将它们拆分成apply。但是一次完成此操作的正确方法是什么,这样我就不需要先执行不必要的list然后再执行join了?

1 个答案:

答案 0 :(得分:1)

从上面的示例创建数据框:

df=pd.DataFrame({'fqdn':['site1.org','site2.org','site3.org','site1.org','site4.org','site1.org','site4.org','site1.org'],\
                 'source':['public_source_a','public_source_a','public_source_a','public_source_b','public_source_b','public_source_b',\
                 'public_source_d','public_source_c']})

使用groupby并应用(列表)

df_grouped=df.groupby('fqdn')['source'].unique().apply(list).reset_index()

与原始df合并并重命名列

result=pd.merge(df,df_grouped,on='fqdn',how='left')
result.rename(columns={'source_x':'source','source_y':'source_list'},inplace=True)