pandas - 创建动态列

pandas - Create dynamic columns

我在每一行中都有一个字典列表。我的目标是将其展平成一行

0    [{'key': 'ga_session_id', 'value': {'string_va...
1    [{'key': 'source', 'value': {'string_value': '...
2    [{'key': 'firebase_event_origin', 'value': {'s...
3    [{'key': 'firebase_conversion', 'value': {'str...

Name: params, dtype: object

这是一行的示例:

[{'key': 'ga_session_id',
  'value': {'string_value': None,
   'int_value': '1575017974',
   'float_value': None,
   'double_value': None}},
 {'key': 'firebase_conversion',
  'value': {'string_value': None,
   'int_value': '1',
   'float_value': None,
   'double_value': None}},
 {'key': 'firebase_event_origin',
  'value': {'string_value': 'auto',
   'int_value': None,
   'float_value': None,
   'double_value': None}},
 {'key': 'ga_session_number',
  'value': {'string_value': None,
   'int_value': '2',
   'float_value': None,
   'double_value': None}},
 {'key': 'engaged_session_event',
  'value': {'string_value': None,
   'int_value': '1',
   'float_value': None,
   'double_value': None}}]

我想迭代行中的每个元素并即时创建动态列。例如:

[{'key': 'ga_session_id',
  'value': {'string_value': None,
   'int_value': '1575017974',
   'float_value': None,
   'double_value': None}}, ...]

**ga_session_id.string_value  |  ga_session_id.int_value  | ga_session_id.float_value |  ...**
None                        |  1575017974               | None                      |  ...

一行中的其他元素也是如此。我知道我们可以使用 apply 动态填充新列。这是我试过的,

import itertools as it
df4 = pd.DataFrame.from_records(it.chain.from_iterable(
    i for i in df2['params']))

这是输出:

pd.concat([df4.drop('value', axis=1), pd.io.json.json_normalize(df['value']).add_prefix('value.')], axis=1)

但是,我忘记了数据所属的行。我需要一些帮助

我创建了数据框的副本,然后逐行迭代动态创建列并在新的(副本)数据框中添加数据。

tmp_df = deepcopy(df)
col_list = []
for index,row in df.iterrows():
    for element in row[column]:
        cols = ["%s.%s"%(element['key'],key) for key in element['value'].keys()]
        tmp_df = tmp_df.reindex(columns=list(dict.fromkeys(tmp_df.columns.tolist() + cols).keys()))
        tmp_df.loc[index,cols] = element['value'].values()