将元组提取到pandas DataFrame中的行中

时间:2017-09-02 14:49:00

标签: python pandas

我有一个看起来像这样的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)来重置索引。换句话说,这一切看起来都很丑陋。有没有简洁明了的方法来解决这个问题?

1 个答案:

答案 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