如何在DataFrame中创建一个新列,以显示不同列中的模式?

时间:2017-12-27 01:30:39

标签: python pandas

我的原始CSV文件如下所示

1, 9
2, 8
3, 9
14, 7
15, 6
19, 8
20, 9
21, 3

我将表A中的连续整数分组为

for grp, val in df.groupby((df.diff()-1).fillna(0).cumsum().index1):
print(val)

结果表:

    A   B
1   1   9
2   2   8
3   3   9
    A   B
14  14  7
15  15  6
    A   B
19  19  8
20  20  9
21  21  3

在实践中,B值是非常长的ID号,但是数字不显着。如何创建一个新的C列,通过为每个ID分配一个简单的值,并在组中为每个副本分配相同的简单值,从而在三个组中的每个组中显示模式?

期望的输出:

    A   B   C
1   1   9   1
2   2   8   2
3   3   9   1
    A   B   C
14  14  7   1
15  15  6   2
    A   B   C
19  19  8   1
20  20  9   2
21  21  3   3

由于

3 个答案:

答案 0 :(得分:1)

你很亲密

df['C']=df.groupby((df.A.diff()-1).fillna(0).cumsum()).B.apply(lambda x : pd.Series(pd.factorize(x)[0]+1)).values
df
Out[105]: 
    A  B  C
0   1  9  1
1   2  8  2
2   3  9  1
3  14  7  1
4  15  6  2
5  19  8  1
6  20  9  2
7  21  3  3

或使用类别

df['C']=df.groupby((df.A.diff()-1).fillna(0).cumsum()).B.apply(lambda x : x.astype('category').cat.codes+1).values
df
Out[110]: 
    A  B  C
0   1  9  2
1   2  8  1
2   3  9  2
3  14  7  2
4  15  6  1
5  19  8  2
6  20  9  3
7  21  3  1

如果你需要循环

for x,df1 in df.groupby((df.A.diff()-1).fillna(0).cumsum()):

    print(df1.assign(C=pd.factorize(df1.B)[0]+1))


   A  B  C
0  1  9  1
1  2  8  2
2  3  9  1
    A  B  C
3  14  7  1
4  15  6  2
    A  B  C
5  19  8  1
6  20  9  2
7  21  3  3

答案 1 :(得分:1)

让我们试试:

df.columns = ['A','B']

g = df.groupby(df.A.diff().ne(1).cumsum())
df['C'] = g['B'].transform(lambda x: pd.factorize(x)[0] + 1)

for n,g in g:
    print(g)

输出:

   A  B  C
0  1  9  1
1  2  8  2
2  3  9  1
    A  B  C
3  14  7  1
4  15  6  2
    A  B  C
5  19  8  1
6  20  9  2
7  21  3  3

答案 2 :(得分:0)

尝试withColumn函数,该函数会向数据框添加新列,您可以指定索引值。