2016-05-20 7 views
1

この質問は前の質問output multiple files based on column value python pandas に続いていますが、今回はもう少し行きたいです。複数の列の値に基づいて複数のファイルを出力するpandas python

はので、私は小さなサンプルデータセットを持っているこの時間は:

import pandas as pd 

df = {'ID': ['H900','H901','H902','M1436','M1435','M149','M157','M213','M699','M920','M871','M789','M617','M991','H903','M730','M191'], 
    'CloneID': [0,1,2,2,2,2,2,2,3,3,3,4,4,4,5,5,6], 
    'Length': [48,42 ,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48]} 

df = pd.DataFrame(df) 

それは次のようになります。

df 
Out[6]: 
    CloneID ID Length 
0  0 H900  48 
1  1 H901  42 
2  2 H902  48 
3  2 M1436  48 
4  2 M1435  48 
5  2 M149  48 
6  2 M157  48 
7  2 M213  48 
8  3 M699  48 
9  3 M920  48 
10  3 M871  48 
11  4 M789  48 
12  4 M617  48 
13  4 M991  48 
14  5 H903  48 
15  5 M730  48 
16  6 M191  48 

は、私は、出力の異なる出力ファイルに各「cloneID」にしたいが、この「H」で始まるIDを含むものだけを時刻にします。

ので、私の所望の出力、4出力ファイル

最初のファイル 'cloneID0.txt'

CloneID ID Length 
     0  H900  48 

第二のファイルは 'CloneID1.txt'

CloneID ID Length 
     1  H901  42 
だろうだろう

3番目のファイルは「CloneID2.txt」

CloneID ID Length 
     2  H902  48 
     2  M1436  48 
     2  M1435  48 
     2  M149  48 
     2  M157  48 
     2  M213  48 

第二のファイルは次のようになり 'CloneID5.txt'

CloneID ID Length 
     5  H903  48 
     5  M730  48 

これらのクローンが持っていないので、それほどNO 'CloneID3.txt'、 'C​​loneID4.txt' と 'CloneID6.txt' はないだろう「H」で始まるID。

私のコード:

import pandas as pd 
data = pd.read_csv('data.txt', sep = '\t') 
gp = data.groupby('CloneID') 
for g in gp.groups: 
    for s in data.ID: 
     if s.startswith("H"): 
      path = 'IgHCloneID' + str(g) + '.xlsx' 
      gp.get_group(g).to_excel(path, index=False) 

それはまだ、すべてのクローンファイルを、「H」で始まるIDが含まれていないものだけを与えました。

答えて

3

あなたができる最初filter

df1 = (df.groupby('CloneID').filter(lambda x: (x.ID.str.startswith("H").any()))) 

df1.groupby('CloneID').apply(lambda x: x.to_csv('CloneID{}.txt'.format(x.name), index=False)) 
-1

反復するクローンIDのリストを作成し、IDフレームワークの最初の値がHであるクローンIDにデータフレームをフィルタリングし、テキストに出力します。

コード

import pandas as pd 

df = {'ID': ['H900','H901','H902','M1436','M1435','M149','M157','M213','M699','M920','M871','M789','M617','M991','H903','M730','M191'], 
    'CloneID': [0,1,2,2,2,2,2,2,3,3,3,4,4,4,5,5,6], 
    'Length': [48,42 ,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48]} 

df = pd.DataFrame(df) 

clone_list = df['CloneID'].drop_duplicates().values.tolist() 

for c in clone_list: 
    clone_df = df.loc[df['CloneID'] == c] 
    clone_df = clone_df.loc[(clone_df['ID'].str[0] == 'H') | (clone_df['ID'].str[0] == 'M')] 
    #Create your text file here 
    print clone_df 

結果

CloneID ID Length 
0  0 H900  48 
    CloneID ID Length 
1  1 H901  42 
    CloneID  ID Length 
2  2 H902  48 
3  2 M1436  48 
4  2 M1435  48 
5  2 M149  48 
6  2 M157  48 
7  2 M213  48 
    CloneID ID Length 
8   3 M699  48 
9   3 M920  48 
10  3 M871  48 
    CloneID ID Length 
11  4 M789  48 
12  4 M617  48 
13  4 M991  48 
    CloneID ID Length 
14  5 H903  48 
15  5 M730  48 
    CloneID ID Length 
16  6 M191  48 
+0

どのように、詳しく説明してください。 IDストリングがHで始まらない各クローンIDの結果を出力します。 – PyNoob

+0

@Jessica Revised、それがあなたに役立つかどうか教えてください。 – PyNoob

0

することはできgroupbyCloneIDapply方法で直接CSVに書き込む:

df.groupby('CloneID').apply(lambda gp: gp.to_csv('CloneID{}.txt'.format(gp.name))) 

これは元のインデックスを保持しますが、コールの前に.set_index('CloneID')で修正できます。

編集:HID開始対応するグループのみ保持する:

をこれは、各グループのチェックを必要とします。ここでの一つのアプローチは、次のとおりです。

ID startswith 'H' と to_csvと最後 groupbyany値の条件によって
df.groupby('CloneID').apply(
    lambda gp: gp.to_csv('CloneID{}.txt'.format(gp.name)) 
    if any(gp.ID.str.startswith('H')) 
    else None) 
+0

これはあなたの希望する出力を複製するようです。 –

関連する問題