Pandas DataFrame - 将行中的少数元素转换为列并填充缺失的数据

时间:2016-09-13 16:15:47

标签: python pandas numpy dataframe

我想通过将行的一些元素转换为列来重新格式化数据帧。 提供我的意思的一个例子。

在下面的数据框中,我希望代码列中的所有元素都是单独的列。像'JFK 10/06 XX'这样缺失的行应填充为0或nan。

原始DataFrame:

loc     date    code
---     -----   ----
LGA     10/05   XX
LGA     10/06   XX
LGA     10/07   XX
LGA     10/05   YY
LGA     10/06   YY
LGA     10/07   YY
JFK     10/05   XX
###JFK      10/06   XX (missing)
JFK     10/07   XX
JFK     10/05   YY
JFK     10/06   YY
JFK     10/07   YY

要格式化DataFrame:

loc     date    XX  YY
---     -----   --  --
LGA     10/05   1   1
LGA     10/06   1   1
LGA     10/07   1   1
JFK     10/05   1   1
JFK     10/06   0   1
JFK     10/07   1   1

这里JFK - > 10/06在XX中有一个条目0

我尝试使用其他列进行分组并能够验证计数,但我无法按预期的方式对其进行格式化。

3 个答案:

答案 0 :(得分:3)

您正在尝试将数据重新整形为宽格式而不使用值列。一种选择是使用pivot_table并将size指定为聚合函数,它将计算索引和列的组合并作为值填充。缺少的值可以用fill_value参数替换:

df.pivot_table(index = ['loc', 'date'], columns = 'code', 
               aggfunc='size', fill_value=0).reset_index()

#code   loc  date  XX  YY
#   0   JFK 10/05   1   1
#   1   JFK 10/06   0   1
#   2   JFK 10/07   1   1
#   3   LGA 10/05   1   1
#   4   LGA 10/06   1   1
#   5   LGA 10/07   1   1

答案 1 :(得分:1)

使用crosstab的另一个解决方案,它计算UITableViewCell参数中出现的值的出现频率:

columns

Image

注意:将列命名为' loc'这不是一个好习惯。巧合的是pd.crosstab(index=[df['loc'], df['date']], columns=df['code']) \ .reset_index(level=1) \ .sort_index(ascending=False) 用于执行基于标签的位置索引的方法。

答案 2 :(得分:0)

  1. stack数据框
  2. 重置索引
  3. 创建计数数据透视表
  4. new_df = (df.set_index(keys=['loc','date'])
              .stack()
              .reset_index()
              .pivot_table(index=['loc','date'], columns=0, fill_value=0, aggfunc='size'))
    

    输出:

    0               XX  YY
    loc date              
    JFK 2016-10-05   1   1
        2016-10-06   0   1
        2016-10-07   1   1
    LGA 2016-10-05   1   1
        2016-10-06   1   1
        2016-10-07   1   1