2017-07-14 81 views
0

我没有太多的熊猫工作经验。我有一个熊猫数据框,如下所示。根据另一个数据框按组创建新的数据框

df = pd.DataFrame({ 'A' : [1,2,1], 
       'start' : [1,3,4], 
       'stop' : [3,4,8]}) 

我想创建一个新的数据框,通过该行进行迭代,并追加到数据帧产生。例如,从输入数据帧的第1行 - 生成数字的[1,2,3]名为1

A seq 
1 1 
1 2 
1 3 
2 3 
2 4 
1 4 
1 5 
1 6 
1 7 
1 8 

到目前为止,我已经成功地确定使用什么功能的序列和相应的列遍历熊猫数据框的行。

+0

我不确定你在做什么。你能否重新说出你的问题? – dustin

回答

2

如果你想使用循环。

In [1164]: data = [] 

In [1165]: for _, x in df.iterrows(): 
     ...:  data += [[x.A, y] for y in range(x.start, x.stop+1)] 
     ...: 

In [1166]: pd.DataFrame(data, columns=['A', 'seq']) 
Out[1166]: 
    A seq 
0 1 1 
1 1 2 
2 1 3 
3 2 3 
4 2 4 
5 1 4 
6 1 5 
7 1 6 
8 1 7 
9 1 8 
3

下面是与应用的一种方式:

(df.set_index('A') 
    .apply(lambda x: pd.Series(np.arange(x['start'], x['stop'] + 1)), axis=1) 
    .stack() 
    .to_frame('seq') 
    .reset_index(level=1, drop=True) 
    .astype('int') 
) 
Out: 
    seq 
A  
1 1 
1 2 
1 3 
2 3 
2 4 
1 4 
1 5 
1 6 
1 7 
1 8 
0

要添加到上述问题的答案,下面是定义一个函数用于解释数据框输入显示,成一种形式,海报想要一个方法:

def gen_df_permutations(perm_def_df): 
    m_list = [] 
    for i in perm_def_df.index: 
     row = perm_def_df.loc[i] 
     for n in range(row.start, row.stop+1): 
      r_list = [row.A,n] 
      m_list.append(r_list) 
    return m_list 

调用它,引用规范数据帧:

gen_df_permutations(df) 

或任意调用它包裹在一个数据帧创建函数返回一个数据帧最终输出:

pd.DataFrame(gen_df_permutations(df),columns=['A','seq']) 


    A seq 
0 1 1 
1 1 2 
2 1 3 
3 2 3 
4 2 4 
5 1 4 
6 1 5 
7 1 6 
8 1 7 
9 1 8 

N.B.第一列是数据帧索引,可以根据需要允许删除/忽略。

相关问题