2017-09-02 38 views
1

我有一个数据帧,看起来像这样:提取元组成排的熊猫数据帧

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) 

后来我发现,为了得到,让我与元组的工作,我已经通过调用该reset_index(drop=True)到索引重置索引new_data_frame。换句话说,所有这些看起来相当丑陋和愚蠢。有没有简洁的方法可以解决这个问题?

回答

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 
+0

哇完美!但关于原始参数列上方的'0'?我想保存它的名字。我的意思是我知道我可以改变它,但是可以做'飞行',可以这么说吗? – BigBear

+0

更新了我的答案 – Dark

+0

如果您发现我的答案有帮助,请接受它,并在可能的情况下使用upvote。 – Dark