Python Pandas-将两列转换为新列作为字典

Python Pandas-将两列转换为新列作为字典,python,pandas,Python,Pandas,我试图使用Pandas将两个列转换为一个列,该列是两个已转换列的字典表示形式 df = DataFrame({'Metrics' : [[("P", "P"), ("Q","Q")], ("K", "K"), ("Z", "Z")], 'Stage_Name' : ["P", "K", "Z"], 'Block_Name' : ["A", "B", "A"]}) 基本上,我想合并度量标准和阶段名称: 进入另一个名为合并的列

我试图使用Pandas将两个列转换为一个列,该列是两个已转换列的字典表示形式

df = DataFrame({'Metrics' : [[("P", "P"), ("Q","Q")], ("K", "K"), ("Z", "Z")], 
                'Stage_Name' : ["P", "K", "Z"],  
                'Block_Name' : ["A", "B", "A"]})
基本上,我想合并
度量标准
阶段名称

进入另一个名为合并的列,例如,第一行是:

{'P': [('P', 'P'), ('Q', 'Q')]}
我知道如何将一行转换为字典表示,但是,我不确定如何在没有for循环的情况下对所有行执行此操作:

something = df.iloc[[0]].set_index('Stage_Name')['Metrics'].to_dict()
print something
Output: {'P': [('P', 'P'), ('Q', 'Q')]}
稍后,我想根据
Block\u Name
进行聚合,因此对于合并列,结果将是为
Block\u Name
添加两个字典:
a

{'P': [('P', 'P'), ('Q', 'Q')], 'Z' : [('Z', 'Z')] }
对于
Stage\u Name
Metrics
,我将其添加到一个列表中,如下所示:

grouped = df.groupby(df['Block_Name'])
df_2 = grouped.aggregate(lambda x: tuple(x))


有人能给我指一下正确的方向吗?谢谢

IIUC正确,然后使用
apply
lambda

In [19]:
df['merged'] = df.apply(lambda row: {row['Stage_Name']:row['Metrics']}, axis=1)
df

Out[19]:
  Block_Name           Metrics Stage_Name                           merged
0          A  [(P, P), (Q, Q)]          P  {'P': [('P', 'P'), ('Q', 'Q')]}
1          B            (K, K)          K                {'K': ('K', 'K')}
2          A            (Z, Z)          Z                {'Z': ('Z', 'Z')}
然后您的代码生成所需的结果:

grouped = df.groupby(df['Block_Name'])
df_2 = grouped.aggregate(lambda x: tuple(x))[['Metrics', 'Stage_Name']]


>>> df_2
                               Metrics Stage_Name
Block_Name                                       
A           ([(P, P), (Q, Q)], (Z, Z))     (P, Z)
B                            ((K, K),)       (K,)
时间:

%timeit df['Merged'] = [{key: val} for key, val in zip(df.Stage_Name, df.Metrics)]
10000 loops, best of 3: 162 µs per loop

%timeit df['merged'] = df.apply(lambda row: {row['Stage_Name']:row['Metrics']}, axis=1)
1000 loops, best of 3: 332 µs per loop

@Alexandar,这种方法有效,但是,这也是我试图避免的方法,因为我认为最好使用panda的内置矢量化函数。@user1157751这是一种常见的误解。请参见上面的性能结果。@Alexandar,噢,哇,我没想到外部的列表连接会更快。您只能在dfs上使用
axis=1
,而不能在
Series
上使用。此操作按行进行,允许您访问单独的列
%timeit df['Merged'] = [{key: val} for key, val in zip(df.Stage_Name, df.Metrics)]
10000 loops, best of 3: 162 µs per loop

%timeit df['merged'] = df.apply(lambda row: {row['Stage_Name']:row['Metrics']}, axis=1)
1000 loops, best of 3: 332 µs per loop