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()
我在每一行中都有一个字典列表。我的目标是将其展平成一行
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()