我有一个看起来像这样的DataFrame:
function_name argument A B
func1 (func1_arg1, func1_arg2) value_a1 b
func2 (func2_arg1,) value_a2 b
func3 (func3_arg1, func3_arg2, func3_arg3) value_a3 b
我希望它看起来像这样:
function_name argument A B
func1 func1_arg1 value_a1 b
func1 func1_arg2 value_a1 b
func2 func2_arg1 value_a2 b
func3 func3_arg1 value_a3 b
func3 func3_arg2 value_a3 b
func3 func3_arg3 value_a3 b
实现它的明确方法是什么? 在交互式python模式中,我尝试执行以下操作:
import pandas as pd
D = {'function_name': ['func1', 'func2', 'func3'],
'argument': [('func1_arg1', 'func1_arg2'),
('func2_arg1',),
('func3_arg1', 'func3_arg2', 'func3_arg3')],
'A': ['value_a1', 'value_a2', 'value_a3'],
'B': 'b'}
data_frame = pd.DataFrame(D)
multiplicity = data_frame.argument.apply(len)
new_index = data_frame.function_name.repeat(multiplicity).index
new_data_frame = data_frame.reindex(new_index)
然后我发现为了获得允许我使用元组的索引,我必须通过调用new_data_frame上的reset_index(drop=True)
来重置索引。换句话说,这一切看起来都很丑陋。有没有简洁明了的方法来解决这个问题?
答案 0 :(得分:1)
如果您有一个数据框data_frame
,那么在将索引设置为function_name
后应用pd.Series,堆叠和重置索引将为您提供结果输出
D = {'function_name': ['func1', 'func2', 'func3'],
'argument': [('func1_arg1', 'func1_arg2'),
('func2_arg1',),
('func3_arg1', 'func3_arg2', 'func3_arg3')],
'A': ['value_a1', 'value_a2', 'value_a3'],
'B': 'b'}
data_frame = pd.DataFrame(D)
new_frame = data_frame.set_index(['function_name','A','B'])['argument'].apply(pd.Series).stack().to_frame('argument').reset_index().drop('level_3',1)
输出:
function_name A B argument 0 func1 value_a1 b func1_arg1 1 func1 value_a1 b func1_arg2 2 func2 value_a2 b func2_arg1 3 func3 value_a3 b func3_arg1 4 func3 value_a3 b func3_arg2 5 func3 value_a3 b func3_arg3