我有一个熊猫数据,如下所示:
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:
输出:对于第一行将是
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:此外,我想创建另一个数据框,其中对M-type 与 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
我尝试了一种使用 for-loop 的方法,该方法非常广泛,因为我的数据很大。我试图采用@piRSquared 在这个问题中给出的方法:How to read two lines from a file and create dynamics keys in a for-loop using python? 但是,无法解决。
考虑numpy
基于辅助函数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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句