【问题标题】:generating matrix with pandas用熊猫生成矩阵
【发布时间】:2017-12-19 15:33:12
【问题描述】:

我想使用 pandas 为数据 df 生成一个矩阵,其逻辑如下:

按 id 分组

低:中上:结束

对于第 1 天:计数 if(如果水平有 Mid 和 End 并且如果 day == 1)

对于第 2 天:计数 if(如果水平有 Mid 和 End 并且如果 day == 2)

….

开始:从中到新

对于第 1 天:计数 if(如果级别有 Mid 和 New 并且如果 day == 1)

对于第 2 天:计数 if(如果级别有 Mid 和 New 并且如果 day == 2)

….

df = pd.DataFrame({'Id':[111,111,222,333,333,444,555,555,555,666,666],'Level':['End','Mid','End','End','Mid','New','End' ,'New','Mid','New','Mid'],'day' : ['',3,'','',2,3,'',3,4,'',2] })

Id |级别 |天

111 |结束|

111 |中| 3

222 |结束|

333 |结束|

333 |中| 2

444 |新| 3

555 |结束|

555 |新| 3

555 |中| 4

666 |新|

666 |中| 2

矩阵如下所示:

低顶 day1 day2 day3 day4

中端 0 1 1 0

中新 0 1 0 1

新结局 0 0 1 0

新中期 0 0 0 1

谢谢!谢谢!

【问题讨论】:

  • 你能发一个df的内容的例子吗?此外,如果您在每行代码/数据之前添加换行符和四个空格,也会有很大帮助。
  • 我发布了 df 和换行符 :)
  • 使用 button{} 格式化数据。
  • 我添加了数据框。希望这会让事情变得更容易
  • 逻辑是什么?你能简化你的问题吗?

标签: pandas matrix count


【解决方案1】:

从你的数据框开始

 # all the combination of Levels
level_combos=[c for c in itertools.combinations(df['Level'].unique().tolist(), 2)]
 # create output and fill with zeros
df_output=pd.DataFrame(0,index=level_combos,columns=range(4))

可能效率不高,但应该可以工作

for g in df.groupby(['Id']): # group by ID
    # combination of levels for this ID
    level_combos_this_id=[c for c in itertools.combinations(g[1]['Level'].unique().tolist(), 2)]


   # set to 1 the days present
    df_output.loc[level_combos_this_id,pd.to_numeric(g[1]['day']).dropna(inplace=True).values]=1

最后重命名列以获得所需的输出

df_output.columns=['day'+str(i+1) for i in range(4)]

【讨论】:

  • 好吧,如果添加更多 'Level' 和 'day' 值,这将起作用。从问题中不清楚这是否相关
  • 你知道为什么我不断得到 'numpy.ndarray' 对象没有属性 'dropna'
  • 哎呀,让我修复它
  • .dropna() 在 .values 之后应用,它将数据帧转换为 numpy 数组。 dropna() 是一个解释错误的 pandas 函数
猜你喜欢
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2017-04-13
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 2016-10-29
相关资源
最近更新 更多