我正在尝试使用Pandas将两列转换为一列,该列是两个转换列的字典表示.
df = DataFrame({'Metrics' : [[("P", "P"), ("Q","Q")], ("K", "K"), ("Z", "Z")],
'Stage_Name' : ["P", "K", "Z"],
'Block_Name' : ["A", "B", "A"]})
Run Code Online (Sandbox Code Playgroud)
基本上我想合并Metrics并Stage_Name:
进入另一个名为的列merged,例如,第一行将是:
{'P': [('P', 'P'), ('Q', 'Q')]}
Run Code Online (Sandbox Code Playgroud)
我知道如何将一行转换为字典表示,但是,我不知道如何在没有for循环的情况下对所有行执行此操作:
something = df.iloc[[0]].set_index('Stage_Name')['Metrics'].to_dict()
print something
Output: {'P': [('P', 'P'), ('Q', 'Q')]}
Run Code Online (Sandbox Code Playgroud)
后来我想基于聚合Block_Name,所以对于合并列,结果将是两个字典加在一起Block_Name:A.
{'P': [('P', 'P'), ('Q', 'Q')], 'Z' : [('Z', 'Z')] }
Run Code Online (Sandbox Code Playgroud)
对于Stage_Name和Metrics,我只是将它附加到列表中,如下所示:
grouped = df.groupby(df['Block_Name'])
df_2 = grouped.aggregate(lambda x: tuple(x))
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向吗?谢谢!
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')}
Run Code Online (Sandbox Code Playgroud)
df['Merged'] = [{key: val} for key, val in zip(df.Stage_Name, df.Metrics)]
>>> df
Block_Name Metrics Stage_Name Merged
0 A [(P, P), (Q, Q)] P {u'P': [(u'P', u'P'), (u'Q', u'Q')]}
1 B (K, K) K {u'K': (u'K', u'K')}
2 A (Z, Z) Z {u'Z': (u'Z', u'Z')}
Run Code Online (Sandbox Code Playgroud)
然后您的代码会产生所需的结果:
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,)
Run Code Online (Sandbox Code Playgroud)
定时:
%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
Run Code Online (Sandbox Code Playgroud)