我有一个看起来像这样的数据帧:
>> df
A
0 [{k1:v1, k2:v2}, {k1:v3, k2:v4}]
1 [{k1:v5, k2:v6}, {k1:v7, k2:v8}, {k1:v9, k2:v10}]
即 A 列是具有相同键的字典列表
我想提取与这些列表中的第一个字典对应的值:
K1 K2 A
0 v1 v2 ...
1 v5 v6 ...
到目前为止,我的解决方案有效,但特别慢(~1K 记录> 50 分钟):
def extract_first_dict(s):
s['K1'] = s['A'][0]['k1']
s['K2'] = s['A'][0]['k2']
return s
df = df.apply(extract_first_dict, axis = 1)
有人可以建议一种更好,更快的方法来做到这一点吗? 谢谢!
选项 1
你应该发现pd.Series.apply
比pd.DataFrame.apply
更有效,因为你只使用一个序列作为输入。
def extract_first(x):
return list(x[0].values())
df['B'] = df['A'].apply(extract_first)
选项 2
您也可以尝试使用列表理解:
df['B'] = [list(x[0].values()) for x in df['A']]
在上述两种情况下,您可以通过以下方式拆分为 2 列:
df[['C', 'D']] = df['B'].apply(pd.Series)
您应该使用数据进行基准测试,以评估这些选项中的任何一个是否足够快,适合您的用例。
但真的...
向上游查找,以更可用的格式获取数据。pandas
不会在一系列词典上提供矢量化功能。您应该考虑仅使用字典列表。
concat
pd.concat([pd.DataFrame(df.A.str[0].tolist(), index=df.index), df], axis=1)
k1 k2 A
0 v1 v2 [{'k1': 'v1', 'k2': 'v2'}, {'k1': 'v3', 'k2': ...
1 v5 v6 [{'k1': 'v5', 'k2': 'v6'}, {'k1': 'v7', 'k2': ...
选项 1
df.A.str[0].apply(pd.Series)
k1 k2
0 v1 v2
1 v5 v6
与join
df.A.str[0].apply(pd.Series).join(df)
k1 k2 A
0 v1 v2 [{'k1': 'v1', 'k2': 'v2'}, {'k1': 'v3', 'k2': ...
1 v5 v6 [{'k1': 'v5', 'k2': 'v6'}, {'k1': 'v7', 'k2': ...
选项 2
pd.DataFrame([t[0] for t in df.A], df.index)
k1 k2
0 v1 v2
1 v5 v6
与join
pd.DataFrame([t[0] for t in df.A], df.index).join(df)
k1 k2 A
0 v1 v2 [{'k1': 'v1', 'k2': 'v2'}, {'k1': 'v3', 'k2': ...
1 v5 v6 [{'k1': 'v5', 'k2': 'v6'}, {'k1': 'v7', 'k2': ...