Как извлечь определенные элементы из столбца фрейма данных и использовать их в качестве меток для оставшихся элементов? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть фрейм данных только с одним столбцом, из которого я хотел бы извлечь определенные элементы и превратить их в отдельный столбец, который будет использоваться в качестве метки для остальных оставшихся элементов. Это немного сложно объяснить, если, например, у меня есть:

pd.DataFrame({'Fruits': ['Apple', 'Gala', 'Fuji', 'Grannysmith', 'Honeycrisp', 'Golden', 'pink', 'Orange', 'blood orange', 'Mandrin', 'Tangerine', 'Clementine', 'Banana', 'baby', 'manzano', 'burro']})

          Fruits
0          Apple
1           Gala
2           Fuji
3    Grannysmith
4     Honeycrisp
5         Golden
6           pink
7         Orange
8   blood orange
9        Mandrin
10     Tangerine
11    Clementine
12        Banana
13          baby
14       manzano
15         burro

Но я пытаюсь преобразовать это в:

    Fruits  Types
0   Apple   Gala
1   Apple   Fuji
2   Apple   Grannysmith
3   Apple   Honeycrisp
4   Apple   Golden
5   Apple   pink
6   Orange  blood orange
7   Orange  Mandrin
8   Orange  Tangerine
9   Orange  Clementine
10  Banana  baby
11  Banana  manzano
12  Banana  burro

Как бы я преобразовал 1-й кадр данных во 2-й? Я чувствую пень от этого, особенно когда может быть много категорий фруктов и их соответствующих типов.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я бы построил отображение словаря с некоторой стандартной логикой, а затем использовал бы его с операциями Pandas

fruit_classes = ['Apple', 'Orange', 'Banana']

last_class = None
fruit_map = {}

for fruit in df.Fruits:
  if fruit in fruit_classes:
    last_class = fruit
  elif last_class is not None:
    fruit_map[fruit] = last_class

df.assign(Types=df.Fruits, Fruits=df.Fruits.map(fruit_map)).dropna()

    Fruits         Types
1    Apple          Gala
2    Apple          Fuji
3    Apple   Grannysmith
4    Apple    Honeycrisp
5    Apple        Golden
6    Apple          pink
8   Orange  blood orange
9   Orange       Mandrin
10  Orange     Tangerine
11  Orange    Clementine
13  Banana          baby
14  Banana       manzano
15  Banana         burro

В качестве альтернативы с пониманием

fruit_classes = ['Apple', 'Orange', 'Banana']

fruit_classes = ['Apple', 'Orange', 'Banana']

pd.DataFrame(
    [[x, None][::(x in fruit_classes) * 2 - 1] for x in df.Fruits],
    columns=['Fruits', 'Types']
).assign(Fruits=lambda d: d.Fruits.ffill()).dropna()

    Fruits         Types
1    Apple          Gala
2    Apple          Fuji
3    Apple   Grannysmith
4    Apple    Honeycrisp
5    Apple        Golden
6    Apple          pink
8   Orange  blood orange
9   Orange       Mandrin
10  Orange     Tangerine
11  Orange    Clementine
13  Banana          baby
14  Banana       manzano
15  Banana         burro
0 голосов
/ 05 ноября 2018

Сначала необходимо определить фрукты в списке, затем создать новый столбец с повторяющимися фруктами на where с isin для пропущенных значений и последующей заливкой, затем удалить те же значения в оба столбца на boolean indexing и последний набор новых имен столбцов:

L = ['Apple','Orange','Banana']

df['a'] = df['Fruits'].where(df['Fruits'].isin(L)).ffill()
df = df.loc[df['a'] != df['Fruits'], ['a','Fruits']]
df.columns = ['Fruits','Types']
print (df)

    Fruits         Types
1    Apple          Gala
2    Apple          Fuji
3    Apple   Grannysmith
4    Apple    Honeycrisp
5    Apple        Golden
6    Apple          pink
8   Orange  blood orange
9   Orange       Mandrin
10  Orange     Tangerine
11  Orange    Clementine
13  Banana          baby
14  Banana       manzano
15  Banana         burro
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...