Нарезка с использованием понимания списка на подмножестве кадра данных - PullRequest
1 голос
/ 04 ноября 2019

Я хочу запустить понимание списка для имен фрагментов с помощью '-' в одном столбце в подмножестве, определенном значениями в других столбцах.

Так что в этом случае:

    category   product_type   name 
0   pc         unit           hero-dominator
1   print      unit           md-ffx605
2   pc         option         keyboard1.x-963

Меня интересует категория «pc» и тип продукта «unit», поэтому я хочу, чтобы в понимании списка менялась только первая строка столбца «name» в этой форме:

    category   product_type   name 
0   pc         unit           dominator
1   print      unit           md-ffx605
2   pc         option         keyboard1.x-963

Я пыталсяthis:

df['name'].loc[df['product_type']=='unit'] = [x.split('-')[1] for x in df['name'].loc[df['product_type']=='unit']]

Но я получаю 'индекс списка вне диапазона' IndexError.

Любая помощь очень ценится.

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете решить проблему следующим образом, следуйте комментариям и не стесняйтесь задавать вопросы:

Редактируйте, теперь мы считаем, что в столбце «имя» могут быть не строковые элементы:

import pandas as pd
import numpy as np


def change(row):
    if row["category"] == "pc" and row["product_type"] == "unit":
        if type(row["name"]) is str:  # check if element is string before split()
            name_split = row["name"].split("-")  # split element
            if len(name_split) == 2:  # it could be name which does not have "-" in it, check it here
                return name_split[1]  # if "-" was in name return second part of split result
            return row["name"]  # else return name without changes

    return row["name"]


# create data frame:
df = pd.DataFrame(
    {
        "category": ["pc", "print", "pc", "pc", "pc", "pc"],
        "product_type": ["unit", "unit", "option", "unit", "unit", "unit"],
        "name": ["hero-dominator", "md-ffx605", "keyboard1.x-963", np.nan, 10.24, None]
    }
)


df["name"] = df.apply(lambda row: change(row), axis=1)  # change data frame here
print(df)

...