熊猫融化:从列到行

时间:2019-09-27 21:09:04

标签: python pandas dataframe

这是我自己学习Python三天后的第一个SO问题,请保持宽容。

我已经连接了四个数据帧:

frames = [dfLocationID, dfDimensions, dfCategories, dfTags]  
result = pd.concat(frames,
                   ignore_index=True,
                   sort=False)

要获取此信息:

        Location ID   Dimensions     Categories              Tags
    0        1000.0          NaN            NaN               NaN
    1           NaN  3,000 sq ft            NaN               NaN
    2           NaN          NaN  * In the Zone               NaN
    3           NaN          NaN      Apartment               NaN
    4           NaN          NaN           Loft               NaN
    5           NaN          NaN            NaN          Bohemian
    6           NaN          NaN            NaN          Colorful
    7           NaN          NaN            NaN   Eclectic Quirky
    8           NaN          NaN            NaN           Kitchen
    9           NaN          NaN            NaN       Living Room
    10          NaN          NaN            NaN             Piano
    11          NaN          NaN            NaN        Wood Floor

我想实现这一目标:

        Location ID   Dimensions        Item              Data
    0        1000.0  3,000 sq ft  Categories     * In the Zone
    1        1000.0  3,000 sq ft  Categories         Apartment
    2        1000.0  3,000 sq ft  Categories              Loft
    3        1000.0  3,000 sq ft        Tags          Bohemian
    4        1000.0  3,000 sq ft        Tags          Colorful
    5        1000.0  3,000 sq ft        Tags   Eclectic Quirky
    6        1000.0  3,000 sq ft        Tags           Kitchen
    7        1000.0  3,000 sq ft        Tags       Living Room
    8        1000.0  3,000 sq ft        Tags             Piano
    9        1000.0  3,000 sq ft        Tags        Wood Floor

然后我尝试了这个:

dfTemp = ((dfLocationID.join(dfDimensions, how='outer')).join(dfCategories, how='outer')).join(dfTags, how='outer')

要获取此信息:

       Location ID   Dimensions     Categories              Tags
    0       1000.0  3,000 sq ft  * In the Zone          Bohemian
    1          NaN          NaN      Apartment          Colorful
    2          NaN          NaN           Loft   Eclectic Quirky
    3          NaN          NaN            NaN           Kitchen
    4          NaN          NaN            NaN       Living Room
    5          NaN          NaN            NaN             Piano
    6          NaN          NaN            NaN        Wood Floor

现在我正在尝试将最后两列转换为行:

dfFinal = dfTemp.melt(id_vars=["Location ID", "Dimensions"],
                          var_name="Item",
                          value_name="Data")

但是我明白了:

        Location ID   Dimensions        Item              Data
    0        1000.0  3,000 sq ft  Categories     * In the Zone
    1           NaN          NaN  Categories         Apartment
    2           NaN          NaN  Categories              Loft
    3           NaN          NaN  Categories               NaN
    4           NaN          NaN  Categories               NaN
    5           NaN          NaN  Categories               NaN
    6           NaN          NaN  Categories               NaN
    7        1000.0  3,000 sq ft        Tags          Bohemian
    8           NaN          NaN        Tags          Colorful
    9           NaN          NaN        Tags   Eclectic Quirky
    10          NaN          NaN        Tags           Kitchen
    11          NaN          NaN        Tags       Living Room
    12          NaN          NaN        Tags             Piano
    13          NaN          NaN        Tags        Wood Floor

关于如何清理数据的任何想法?另外,我将不得不遍历不同的位置ID,并且类别和标签中的值的数量将不是恒定的。

谢谢。

1 个答案:

答案 0 :(得分:0)

首先,我将context.tblWorkOrder.AsNoTracking().Include(r => r.CloseBy).Include(r => r.EnteredBy) ... 转换为NaN,因为它们更易于处理:

None

然后,您希望整个第一列和第二列具有相同的值(我不知道您在何处进行假设):

df = df.where((pd.notnull(df)), None)

然后,您可以按原样运行melt函数。现在,您只需要过滤掉“项目”或“数据”列中所有df['Location ID'] = df['Location ID'].iloc[0] df['Dimensions'] = df['Dimensions'].iloc[1] 的行:

None

然后,输出如您所愿:

df = df[~(df["Item"].isnull() | df["Data"].isnull())]

如果需要在其他位置执行此操作,请将此过程打包到函数Location ID Dimensions Item Data 2 1000.0 3000 sq ft Categories * In the Zone 3 1000.0 3000 sq ft Categories Apartment 4 1000.0 3000 sq ft Categories Loft 17 1000.0 3000 sq ft Tags Bohemian 18 1000.0 3000 sq ft Tags Colorful 19 1000.0 3000 sq ft Tags Eclectic Quirky 20 1000.0 3000 sq ft Tags Kitchen 21 1000.0 3000 sq ft Tags Living Room 22 1000.0 3000 sq ft Tags Piano 23 1000.0 3000 sq ft Tags Wood Floor 中,并使用transform

groupby