【发布时间】:2019-08-14 22:38:11
【问题描述】:
我正在尝试根据存储在另一列中的字典创建两列
df[[col1, col2]] = df[dict_data].apply(lambda x: x['col1_data'], x['col2_data'])
这可能吗?还是应该分两行来完成?
【问题讨论】:
我正在尝试根据存储在另一列中的字典创建两列
df[[col1, col2]] = df[dict_data].apply(lambda x: x['col1_data'], x['col2_data'])
这可能吗?还是应该分两行来完成?
【问题讨论】:
首先,您的apply(...) 不起作用,因为x['col2_data'] 不被解释为lambda 的一部分,而是作为apply 函数的第二个参数。因此,要让两者都从 lambda 返回,您需要将它们包装在一个对象中,例如list() 如[x['col1_data'], x['col2_data'] 或tuple 如(x['col1_data'], x['col2_data']) 或set 如{x['col1_data'], x['col2_data'}。
要实现你想要的,虽然你可以这样做:
给定一个 pandas DataFrame 定义为:
In[2] df = pd.DataFrame({'a': {'r1': {'k1': 1, 'k2': 2}, 'r2': {'k1': 1, 'k2': 2}}})
In[3] df
Out[3]:
a
r1 {'k1': 1, 'k2': 2}
r2 {'k1': 1, 'k2': 2}
你可以这样做:
df[['b', 'c']] = pd.DataFrame(df.apply(lambda x: (x.a['k1'], x.a['k2']), axis=1).tolist(), index=df.index)
这将产生:
Out[6]:
a b c
r1 {'k1': 1, 'k2': 2} 1 2
r2 {'k1': 1, 'k2': 2} 1 2
您当然也可以在两条单独的线路中实现相同的目标,恕我直言,这样更清洁、更高效。
希望这会有所帮助:)
【讨论】:
使用 jniegsch 的 df 示例:
In[2] df = pd.DataFrame({'a': {'r1': {'k1': 1, 'k2': 2}, 'r2': {'k1': 1, 'k2': 2}}})
In[3] df
Out[3]:
a
r1 {'k1': 1, 'k2': 2}
r2 {'k1': 1, 'k2': 2}
另一种方法是:
df[['b', 'c']] = pd.DataFrame(df.a.to_dict()).set_index(df.index)
a b c
r1 {'k1': 1, 'k2': 2} 1 1
r2 {'k1': 1, 'k2': 2} 2 2
【讨论】: