【问题标题】:How to rearrange the columns of a DataFrame into an indexed binary matrix?如何将 DataFrame 的列重新排列为索引二进制矩阵?
【发布时间】:2021-01-07 11:47:54
【问题描述】:

我正在尝试转换此数据框:

data_in = {
    'dates': [2017, 2017, 2018, 2019, 2019, 2019],
    'names': ['Roger', 'Rafa', 'Roger', 'Rafa', 'Novak', 'Dom']
}
df_in = pd.DataFrame(data_in)
>>> df_in
    dates   names
0   2017    Roger
1   2017    Rafa
2   2018    Roger
3   2019    Rafa
4   2019    Novak
5   2019    Dom

进入这个二进制矩阵:

>>> df_out

    Roger   Rafa    Novak   Dom
dates               
2017    1   1   0   0
2018    1   0   0   0
2019    0   1   1   1

所有日期作为索引,所有名称作为列,如果在日期出现名称,则数据为 1,如果不出现,则为 np.NaN 或 0。

我可以构建带有索引和列的 df_out 数据框,但是您将如何获取数据?

【问题讨论】:

  • 更新数据是什么意思?另外,如果你有 2017 年,罗杰 2 次应该怎么办?
  • @L.Papadopoulos – 不是真的,因为我想在这里将具有重复项的列转换为具有唯一值的索引。
  • @DaniMesejo – ''更新'' 数据已重新制定。每对夫妇(日期、姓名)都是独一无二的。

标签: python pandas


【解决方案1】:

get_dummiesmax 一起用于1,如果存在值,则使用0

df = pd.get_dummies(df_in.set_index('dates')['names']).groupby(level=0).max()
print (df)
       Dom  Novak  Rafa  Roger
dates                         
2017     0      0     1      1
2018     0      0     0      1
2019     1      1     1      0

【讨论】:

  • level 参数有什么作用??
  • 它为每个索引创建最大值,所以最大值总是1
  • @Corralien - 什么版本的熊猫?
  • @Corralien - 谢谢,这是一个不错的功能,但理解它的原因。
【解决方案2】:

使用crosstab:

res = pd.crosstab(df_in['dates'], df_in['names'])
print(res)

输出

names  Dom  Novak  Rafa  Roger
dates                         
2017     0      0     1      1
2018     0      0     0      1
2019     1      1     1      0

如果只需要指标功能,做:

res = pd.crosstab(df_in['dates'], df_in['names']).gt(0).astype(int)
print(res)

输出

names  Dom  Novak  Rafa  Roger
dates                         
2017     0      0     1      1
2018     0      0     0      1
2019     1      1     1      0

【讨论】:

  • 他为什么需要假人?有区别吗?
  • @adirabargil - 当然,如果重复,则 crosstab 计算数据,get_dummies 从不
  • 如果用户只需要二进制值,那么 get_dummies 可以比交叉表快得多。当然,这只有在用户对速度感兴趣时才有意义。
  • 好吧,你是对的,OP 说他需要二进制文件.. 但是它仍然很好的答案(在其他情况下会产生错误)
猜你喜欢
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多