2017-07-14 79 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.第一列是數據幀索引,可以根據需要允許刪除/忽略。

相關問題