我是pandas的新手,并且有一个像
这样的数据集id values exp
z1 s1 NaN
z1 s2 NaN
z1 s3 NaN
z1 s4 v
z1 s2 NaN
z1 s3 NaN
z1 s4 w
z2 s1 NaN
z2 s5 NaN
z2 s4 w
z3 s1 NaN
z3 s2 NaN
z3 s3 NaN
z3 s4 v
z4 s1 NaN
z4 s2 NaN
z4 s4 w
我希望获得类似(表2)的输出,显示由exp
列中的值终止的序列的频率
id seq exp
z1 s1-s2-s3-s4 v
z1 s2-s3-s4 w
z2 s1-s5-s4 w
z3 s1-s2-s3-s4 v
z4 s1-s2-s4 w
我想要的最终结果如下,但我可以使用Table2来实现目标。
seq count
s1-s2-s3-s4 2
s2-s3-s4 1
s1-s5-s4 1
s1-s2-s4 1
寻找使用pandas / python解决此问题的指导。
答案 0 :(得分:1)
您可以使用bfill
替换NaN
回填,然后使用groupby
列id
和Series
bfill
创建apply
1}} join
。最后value_counts
:
print (df.exp.bfill())
0 v
1 v
2 v
3 v
4 w
5 w
6 w
7 w
8 w
9 w
10 v
11 v
12 v
13 v
14 w
15 w
16 w
Name: exp, dtype: object
df = df.groupby(['id', df.exp.bfill()])['values'].apply('-'.join).reset_index()
print (df)
id exp values
0 z1 v s1-s2-s3-s4
1 z1 w s2-s3-s4
2 z2 w s1-s5-s4
3 z3 v s1-s2-s3-s4
4 z4 w s1-s2-s4
df1 = df['values'].value_counts().reset_index()
df1.columns = ['seq','counts']
print (df1)
seq counts
0 s1-s2-s3-s4 2
1 s2-s3-s4 1
2 s1-s2-s4 1
3 s1-s5-s4 1