如何标记相同的熊猫数据框行?

时间:2018-06-21 20:26:56

标签: python python-3.x pandas

我有一个像这样的大熊猫数据框:

log  apple   watermelon  orange  lemon  grapes

1      1         1         yes     0      0
1      2         0         1       0      0
1     True       0         0       0      2
2      0         0         0       0      2
2      1         1         yes     0      0
2      0         0         0       0      2
2      0         0         0       0      2
3     True       0         0       0      2
4      0         0         0       0      2.1
4      0         0         0       0      2.1

如何标记相同的行,例如:

log   apple   watermelon  orange  lemon  grapes   ID

1      1         1         yes     0      0      1
1      2         0         1       0      0      2
1     True       0         0       0      2      3
2      0         0         0       0      2      4
2      1         1         yes     0      0      1
2      0         0         0       0      2      4
2      0         0         0       0      2      4
3     True       0         0       0      2      3
4      0         0         0       0      2.1    5
4      0         0         0       0      2.1    5

我试图:

df['ID']=df.groupby('log')[df.columns].transform('ID')

df['personid'] = df['log'].clip_upper(2) - 2*d.duplicated(subset='apple')
df

但是,上面的方法不起作用,因为我确实有很多列。

但是它没有给我预期的输出。关于如何分组和标记此数据框的任何想法?

1 个答案:

答案 0 :(得分:1)

给予

x = io.StringIO("""log  apple   watermelon  orange  lemon  grapes

1      1         1         yes     0      0
1      2         0         1       0      0
1     True       0         0       0      2
2      0         0         0       0      2
2      1         1         yes     0      0
2      0         0         0       0      2
2      0         0         0       0      2
3     True       0         0       0      2
4      0         0         0       0      2.1
4      0         0         0       0      2.1""")
df2 = pd.read_table(x, delim_whitespace=True)

您可以首先将transform与元组一起使用,以使每行成为 hashable 并具有可比性,然后再使用索引和range来创建唯一的ID

f = df2.transform(tuple,1).to_frame()
k = f.groupby(0).sum()
k['id'] = range(1,len(k.index)+1)

最后

df2['temp_key'] = f[0]
df2 = df2.set_index('temp_key')
df2['id'] = k.id
df2.reset_index().drop('temp_key', 1)

    log     apple   watermelon  orange  lemon   grapes  id
0   1       1       1           yes     0       0.0     1
1   1       2       0           1       0       0.0     2
2   1       True    0           0       0       2.0     3
3   2       0       0           0       0       2.0     4
4   2       1       1           yes     0       0.0     5
5   2       0       0           0       0       2.0     4
6   2       0       0           0       0       2.0     4
7   3       True    0           0       0       2.0     6
8   4       0       0           0       0       2.1     7
9   4       0       0           0       0       2.1     7