2017-02-22 352 views
1

У меня есть панда данные, такие как следующие:Как подсчитать количество повторений пункта/значения из определенного столбца в другом/другом столбце фреймворка pandas?

MA1  MA2  MA3  Sp3    Sp4  Sp6   F1_x  F1_y 
TgT,TgT TgT,TgT  TgT,TgT,TgT TgT,TgC   TgT,CgC TgT,TgC,CgT,CgC  CgC  TgT 
CgT  CgT,CgT,CgT CgT,CgT  CgT,CgC,GgT,GgC CgT,GgC GgT,GgC,CgT   GgC  CgT 
TgC  TgG,TgC  TgC   TgC,CgG   CgG,CgG TgG,TgC    CgG  TgC 

Задача 01:

  • Я буду читать строковые значения в F1_x и F1_y и хочу посчитать , сколько F1_x vs y находятся в других столбцах?
  • отсчеты F1_x будут записаны в первую очередь по трубе (|).

Вывод: Для первой линии будет

MA1 MA2  MA3  Sp3 Sp4 Sp6  F1_x F1_y 
0|2  0|2  0|3  0|1 1|1  1|1  CgC  TgT 

Задача 02: Кроме того, я хочу, чтобы создать еще один dataframe где отсчеты делается для M-типа против S- type column.

Выход: для первой линии будет

 like_M  like_S 
     x y  x y 
     0|7   1|3 

или

like_M  like_S  F1_x F1_y 
    0|7   1|3  CgC  TgT 

Я попробовал метод, используя для цикла, который был довольно обширен, потому что мои данные огромны. Я попытался использовать этот метод, заданный @piRSquared в этом вопросе: How to read two lines from a file and create dynamics keys in a for-loop using python? , но не смог его обработать.

ответ

1

Рассмотрит функцию numpy на основе Helper count_in

def count_in(clst, cols): 
    cols = np.asarray(cols) 
    c1 = np.core.defchararray.split(np.asarray(clst).astype(str), ',') 
    l = np.array([len(i) for i in c1]) 
    s = np.concatenate(c1) 
    r = np.arange(len(cols)) 
    c = (s[:, None] == cols[r.repeat(l)]).cumsum(0) 

    z = np.zeros(cols.shape[1], dtype=int) 
    counts = np.diff(np.vstack([z, c[l.cumsum() - 1]]), axis=0).astype(str) 
    return pd.Series(counts.tolist(), clst.index).str.join('|') 

затем apply

cols = ['F1_x', 'F1_y'] 
d1 = df.drop(cols, 1).apply(count_in, cols=df[cols]) 
d1.join(df[cols]) 

    MA1 MA2 MA3 Sp3 Sp4 Sp6 F1_x F1_y 
0 0|2 0|2 0|3 0|1 1|1 1|1 CgC TgT 
1 0|1 0|3 0|2 1|1 1|1 1|1 GgC CgT 
2 0|1 0|1 0|1 1|1 2|0 0|1 CgG TgC 

Тогда

d2 = d1.stack().str.split('|', expand=True).astype(int) 
d3 = d2.groupby(
    [d2.index.get_level_values(0), d2.index.get_level_values(1).str[0]] 
).sum() 
pd.Series(
    d3.astype(str).values.tolist(), d3.index 
).str.join('|').unstack().rename(columns='like_{}'.format).join(df[cols]) 

    like_M like_S F1_x F1_y 
0 0|7 2|3 CgC TgT 
1 0|6 3|3 GgC CgT 
2 0|3 3|2 CgG TgC 
+0

спасибо за ответ. Если вы когда-нибудь, можете ли вы добавить какое-то объяснение. Я пытаюсь прочитать pandas doc и ваш скрипт, чтобы узнать, что делает каждая часть кода. Любая информация будет полезна. – everestial007