我一直在努力挣扎,感觉有点卡住。
我有一个由这样的数据组成的数据框,名为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列表,而不是命令分隔字符串)。例如,根据此示例数据,为fqdn
值site1.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
了?
答案 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)