【问题标题】:Make a table from 2 columns从 2 列创建一个表
【发布时间】:2017-01-29 17:57:08
【问题描述】:

我是 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

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

【问题讨论】:

  • 数据?我从文件中读取它
  • 当然可以,但是怎么做呢?提供代码,我们或许可以提供更多帮助。

标签: python pandas group-by aggregate multiple-columns


【解决方案1】:

我认为您需要通过size 进行聚合,并通过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

您可以使用 count 代替 sizesize 计数 NaN 值,count 不计数。

【讨论】:

  • 如果您的问题需要输出,请使用size函数。
【解决方案2】:

假设您的列名为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表格分层,然后将其拆开:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2021-08-16
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    相关资源
    最近更新 更多