从 2 列创建 table

Make a table from 2 columns

我是 Python 的新手。

我在数据框上有 2 列,列类似于:

db = pd.read_excel(path_to_file/file.xlsx)
db = db.loc[:,['col1','col2']]

col1  col2
C     4
C     5
A     1
B     6
B     1
A     2
C     4

我需要他们是这样的:

   1 2 3 4 5 6
A  1 1 0 0 0 0
B  1 0 0 0 0 1
C  0 0 0 2 1 0

所以它们就像行和列一样,值指的是巧合的数量。

我认为您需要按 size and add missing values to columns by reindex:

进行汇总
print (df)
   a  b
0  C  4
1  C  5
2  A  1
3  B  6
4  B  1
5  A  2
6  C  4

df1 = df.b.groupby([df.a, df.b])
          .size()
          .unstack()
          .reindex(columns=(range(1,df.b.max() + 1)))
          .fillna(0)
          .astype(int)

df1.index.name = None
df1.columns.name = None
print (df1)
   1  2  3  4  5  6
A  1  1  0  0  0  0
B  1  0  0  0  0  1
C  0  0  0  2  1  0

而不是 size 你可以使用 countsize counts NaN values, count 不行。

假设您的列名为 catval:

In [26]: df = pd.DataFrame({'cat': ['C', 'C', 'A', 'B', 'B', 'A', 'C'], 'val': [4, 5, 1, 6, 1, 2, 4]})

In [27]: df
Out[27]: 
  cat  val
0   C    4
1   C    5
2   A    1
3   B    6
4   B    1
5   A    2
6   C    4

然后你可以 groupby table 分层,然后取消堆叠:

In [28]: df.val.groupby([df.cat, df.val]).sum().unstack().fillna(0).astype(int)
Out[28]: 
val  1  2  4  5  6
cat               
A    1  2  0  0  0
B    1  0  0  0  6
C    0  0  8  5  0

编辑

正如 IanS 所指出的,这里缺少 3(谢谢!)。如果你必须有一系列的列,那么你可以使用

r = df.val.groupby([df.cat, df.val]).sum().unstack().fillna(0).astype(int)

for c in set(range(1, 7)) - set(df.val.unique()):
    r[c] = 0