我的问题很简单, 让我们从一个假设的表开始
| a | b | c |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 0 | 1 | 2 |
| 1 | 2 | 3 |
| 1 | 2 | 3 |
| 1 | 3 | 4 |
应修改此表,b列中的数字不相同 列a中存在,列c与列b中的数字不同 所以这个数字应该不断递增 决赛应该是这样的:
| a | b | c |
| 0 | 2 | 6 |
| 0 | 2 | 6 |
| 0 | 3 | 7 |
| 0 | 3 | 8 |
| 1 | 4 | 9 |
| 1 | 4 | 9 |
| 1 | 5 | 10 |
最后,还有一张桌子。基于最后一个表,由于c是b的子节点和b的子节点,因此该表应该在两列表中转换,第三列具有每行的高度:
| parent | child | size |
| 0 | 2 | 2 |
| 0 | 3 | 2 |
| 1 | 4 | 2 |
| 1 | 5 | 1 |
| 2 | 6 | 2 |
| 3 | 7 | 1 |
| 3 | 8 | 1 |
| 4 | 9 | 2 |
| 5 | 10 | 1 |
在第3个表中,所有行都是唯一的,只使用两列映射所有树。第3列是每行的高度,这意味着每对在第二个表中出现的次数。
答案 0 :(得分:1)
IIUC使用factorize
import pandas as pd
import numpy as np
s=df.stack().sort_index(level=[1])
s=pd.Series(pd.factorize(s.astype(str)+s.index.get_level_values(level=1))[0],index=s.index).unstack()
s
Out[665]:
a b c
0 0 2 6
1 0 2 6
2 0 3 7
3 0 3 8
4 1 4 9
5 1 4 9
6 1 5 10
yourdf=pd.DataFrame(np.append(s[['a','b']].values,s[['b','c']].values,axis=0),columns=['p','c']).groupby(['p','c']).size().reset_index()
yourdf
Out[681]:
p c 0
0 0 2 2
1 0 3 2
2 1 4 2
3 1 5 1
4 2 6 2
5 3 7 1
6 3 8 1
7 4 9 2
8 5 10 1
答案 1 :(得分:0)
我去了两个
n = len(df)
col = df.columns.repeat(n)
val = df.values.ravel(order='F')
f, u = pd.factorize(list(zip(col, val)))
table1 = pd.DataFrame(f.reshape(df.shape, order='F'), df.index, df.columns)
pc, pc_ = pd.factorize(list(zip(f[:-n], f[n:])))
table2 = pd.DataFrame(
np.column_stack([pc_.tolist(), np.bincount(pc)]),
columns=list('pcn')
)
print(table1, table2, sep='\n\n')
a b c
0 0 2 6
1 0 2 6
2 0 3 7
3 0 3 8
4 1 4 9
5 1 4 9
6 1 5 10
p c n
0 0 2 2
1 0 3 2
2 1 4 2
3 1 5 1
4 2 6 2
5 3 7 1
6 3 8 1
7 4 9 2
8 5 10 1