Python 合并:从列到行

Python 合并:从列到行,python,pandas,dataframe,Python,Pandas,Dataframe,这是我自己学习Python三天后的第一个SO问题,所以请宽容一点 我连接了四个数据帧: frames = [dfLocationID, dfDimensions, dfCategories, dfTags] result = pd.concat(frames, ignore_index=True, sort=False) 要获得此信息: Location ID Dimensions Ca

这是我自己学习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     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
        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
我希望做到这一点:

        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          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     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
        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
现在我尝试将最后两列转换为行:

dfFinal = dfTemp.melt(id_vars=["Location ID", "Dimensions"],
                          var_name="Item",
                          value_name="Data")
但我明白了:

        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     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
        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,类别和标记中的值的数量将不是常数


谢谢。

首先,我将
NaN
s转换为
None
,因为它们更容易处理:

df = df.where((pd.notnull(df)), None)
然后,您希望整个第一列和第二列具有相同的值(我不知道您在何处做出该假设):

然后可以按原样运行熔化功能。现在,您只需过滤掉“Item”或“Data”列中
None
的所有行:

然后,输出是您想要的:

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

df_new = pd.DataFrame(columns = df.columns)
for name, group in df.groupby(['Location ID', 'Dimensions']):
    df_group = transform(group)
    pd.concat([df_new, df_group], axis=0)

首先,我将
NaN
s转换为
None
,因为它们更易于处理:

df = df.where((pd.notnull(df)), None)
然后,您希望整个第一列和第二列具有相同的值(我不知道您在何处做出该假设):

然后可以按原样运行熔化功能。现在,您只需过滤掉“Item”或“Data”列中
None
的所有行:

然后,输出是您想要的:

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

df_new = pd.DataFrame(columns = df.columns)
for name, group in df.groupby(['Location ID', 'Dimensions']):
    df_group = transform(group)
    pd.concat([df_new, df_group], axis=0)

你能发布
dfLocationID,dfDimensions,dfCategories,dfTags的内容吗?
?我尝试了一种不同的方法来加入这四个dfs:
dfTemp=((dfLocationID.join(dfDimensions,how='outer')).join(dfCategories,how='outer')).join(dfCategories,how='outer')。join(dfTags,how='outer')
你能发布
dfLocationID,dfDimensions,dfCategories,dfCategories,dfTags
?我尝试了一种不同的方法来连接四个dfs:
dfTemp=((dfLocationID.join(dfDimensions,how='outer')).join(dfCategories,how='outer')).join(dfTags,how='outer')