【问题标题】:How to concatenate two dataframes in particular format?如何以特定格式连接两个数据帧?
【发布时间】:2021-05-17 09:02:31
【问题描述】:

我有一个数据框。

Item       Photo1     Photo2    Photo3    Photo4   Description1  Description2  Description 3

A           A1.jpg      A2.jpg                        Nice           Beautiful
B           B1.jpg      B2.jpg    B3.jpg    B4.jpg    Ugly           Damaged
C           C1.jpg                                    Cute           Handsome     Nice

我将这些数据框分成:

df1(根据照片)

 I             A
PH           A1.jpg
PH           A2.jpg
 I             B
PH           B1.jpg
PH           B2.jpg
PH           B3.jpg
PH           B4.jpg
 I             C
PH           C1.jpg

df2(根据描述)

Description Nice
Description Beautiful
Description Ugly
Description Damaged
Description Cute
Description Handsome
Description Nice

我尝试使用以下方法连接两个数据帧:

pd.concat([df1,df2])

输出:

 I             A
PH           A1.jpg
PH           A2.jpg
 I             B
PH           B1.jpg
PH           B2.jpg
PH           B3.jpg
PH           B4.jpg
 I             C
PH           C1.jpg
Description Nice
Description Beauiful
Description Ugly
Description Damaged
Description Cute
Description Handsome
Description Nice

如何根据第一个dataframe以特定的格式拼接,并以如下格式显示?

预期输出:

I             A
PH           A1.jpg
PH           A2.jpg
Description Nice
Description Beauiful
I             B
PH           B1.jpg
PH           B2.jpg
PH           B3.jpg
PH           B4.jpg
Description Ugly
Description Damaged
I             C
PH           C1.jpg
Description Cute
Description Handsome
Description Nice

【问题讨论】:

  • 不这么认为
  • df2 没有留下关于如何拆分和合并的信息。您必须以与 df1 相同的方式使用 I 列才能允许加入。
  • df2 仅包含描述值。

标签: python python-3.x pandas dataframe numpy


【解决方案1】:

这是一个答案。

import pandas as pd

df = pd.DataFrame({'Item': ['A', 'B', 'C'],
                   'Photo1': ['A1.jpg', 'B1.jpg', 'C1.jpg'],
                   'Photo2': ['A2.jpg', 'B2.jpg', ''],
                   'Photo3': ['', 'B3.jpg', ''],
                   'Photo4': ['', 'B4.jpg', ''],
                   'Description1': ['Nice', 'Ugly', 'Cute'],
                   'Description2': ['Beautiful', 'Damaged', 'Handsome'],
                   'Description3': ['', '', 'Nice']})

tmp = df.T
tmp.index = ['I', 'PH', 'PH', 'PH', 'PH', 'Description', 'Description', 'Description']

df_a = tmp.loc[tmp[0]!= '', [0]].rename(columns={0: 'output'})
df_b = tmp.loc[tmp[1]!= '', [1]].rename(columns={1: 'output'})
df_c = tmp.loc[tmp[2]!= '', [2]].rename(columns={2: 'output'})

result = pd.concat([df_a, df_b, df_c])

结果是

>>> result

                output
I                    A
PH              A1.jpg
PH              A2.jpg
Description       Nice
Description  Beautiful
I                    B
PH              B1.jpg
PH              B2.jpg
PH              B3.jpg
PH              B4.jpg
Description       Ugly
Description    Damaged
I                    C
PH              C1.jpg
Description       Cute
Description   Handsome
Description       Nice

【讨论】:

    【解决方案2】:

    更新

    给定df,

    d = {'Item': {0: 'A', 1: 'B', 2: 'C'}, 'Photo1': {0: 'A1.jpg', 1: 'B1.jpg', 2: 'C1.jpg'}, 'Photo2': {0: 'A2.jpg', 1: 'B2.jpg', 2: nan}, 'Photo3': {0: nan, 1: 'B3.jpg', 2: nan}, 'Photo4': {0: nan, 1: 'B4.jpg', 2: nan}, 'Description1': {0: 'Nice', 1: 'Ugly', 2: 'Cute'}, 'Description2': {0: 'Beautiful', 1: 'Damaged', 2: 'Handsome'}, 'Description 3': {0: None, 1: None, 2: 'Nice'}}
    
    df = pd.DataFrame(d)
    df
    

    输入数据框:

      Item  Photo1  Photo2  Photo3  Photo4 Description1 Description2 Description 3
    0    A  A1.jpg  A2.jpg     NaN     NaN         Nice    Beautiful          None
    1    B  B1.jpg  B2.jpg  B3.jpg  B4.jpg         Ugly      Damaged          None
    2    C  C1.jpg     NaN     NaN     NaN         Cute     Handsome          Nice
    

    然后df1,创建:

     df1 = df.iloc[:, 0:5].stack()
    

    输出:

    0  Item           A
       Photo1    A1.jpg
       Photo2    A2.jpg
    1  Item           B
       Photo1    B1.jpg
       Photo2    B2.jpg
       Photo3    B3.jpg
       Photo4    B4.jpg
    2  Item           C
       Photo1    C1.jpg
    dtype: object
    

    并创建了 df2,

    df2 = df.iloc[:,5:].stack()
    

    输出:

    0  Description1          Nice
       Description2     Beautiful
    1  Description1          Ugly
       Description2       Damaged
    2  Description1          Cute
       Description2      Handsome
       Description 3         Nice
    dtype: object
    

    现在,让我们pd.concat,df1 和 df2,使用 df 的索引和列标题的结构来对行进行排序:

    pd.concat([df2, df1]).reindex(pd.MultiIndex.from_product([df.index, df.columns]))
    

    输出:

    0  Item                     A
       Photo1              A1.jpg
       Photo2              A2.jpg
       Photo3                 NaN
       Photo4                 NaN
       Description1          Nice
       Description2     Beautiful
       Description 3          NaN
    1  Item                     B
       Photo1              B1.jpg
       Photo2              B2.jpg
       Photo3              B3.jpg
       Photo4              B4.jpg
       Description1          Ugly
       Description2       Damaged
       Description 3          NaN
    2  Item                     C
       Photo1              C1.jpg
       Photo2                 NaN
       Photo3                 NaN
       Photo4                 NaN
       Description1          Cute
       Description2      Handsome
       Description 3         Nice
    dtype: object
    

    让我们试试 df.stack():

    d = {'Item': {0: 'A', 1: 'B', 2: 'C'}, 'Photo1': {0: 'A1.jpg', 1: 'B1.jpg', 2: 'C1.jpg'}, 'Photo2': {0: 'A2.jpg', 1: 'B2.jpg', 2: nan}, 'Photo3': {0: nan, 1: 'B3.jpg', 2: nan}, 'Photo4': {0: nan, 1: 'B4.jpg', 2: nan}, 'Description1': {0: 'Nice', 1: 'Ugly', 2: 'Cute'}, 'Description2': {0: 'Beautiful', 1: 'Damaged', 2: 'Handsome'}, 'Description 3': {0: None, 1: None, 2: 'Nice'}}
    
    df = pd.DataFrame(d)
    df
    

    输入数据框:

      Item  Photo1  Photo2  Photo3  Photo4 Description1 Description2 Description 3
    0    A  A1.jpg  A2.jpg     NaN     NaN         Nice    Beautiful          None
    1    B  B1.jpg  B2.jpg  B3.jpg  B4.jpg         Ugly      Damaged          None
    2    C  C1.jpg     NaN     NaN     NaN         Cute     Handsome          Nice
    

    让我们stack:

    df_out = df.stack().reset_index(level=0, drop=True)
    

    输出:

    Item                     A
    Photo1              A1.jpg
    Photo2              A2.jpg
    Description1          Nice
    Description2     Beautiful
    Item                     B
    Photo1              B1.jpg
    Photo2              B2.jpg
    Photo3              B3.jpg
    Photo4              B4.jpg
    Description1          Ugly
    Description2       Damaged
    Item                     C
    Photo1              C1.jpg
    Description1          Cute
    Description2      Handsome
    Description 3         Nice
    dtype: object
    

    【讨论】:

    • 我不要他们这样,我要拼接
    • @AtomStore 查看更新... 使用 df 结构对 pd.concat 结果进行排序。
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 2017-11-02
    • 2016-09-16
    • 2020-09-02
    • 2017-10-11
    • 2019-01-14
    • 2018-04-30
    • 2019-05-20
    相关资源
    最近更新 更多