Расплав панд: колонны в рядки - PullRequest
1 голос
/ 28 сентября 2019

Это мой первый ТАК вопрос после трех дней самостоятельного изучения Python, поэтому, пожалуйста, будьте снисходительны.

Я объединил четыре кадра данных:

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

Есть идеи о том, как очистить данные?Кроме того, мне придется перебирать различные идентификаторы местоположений, и количество значений в категориях и тегах не будет постоянным.

Спасибо.

1 Ответ

0 голосов
/ 28 сентября 2019

Прежде всего, я бы преобразовал NaN s в None, так как с ними проще работать:

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

Затем вы хотите, чтобы весь первый и второй столбцы имелите же значения (я не знаю, где вы делаете это предположение):

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:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...