1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/it-ebooks-pandas-cookbook-code-notes

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
8.md 21 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 01:15 e628503

movie[['movie_title', 'actor_1_name', 'actor_2_name', 'actor_3_name',
'actor_1_facebook_likes', 'actor_2_facebook_likes', 'actor_3_facebook_likes']] actor.head()

movie_title actor_1_name actor_2_name actor_3_name actor_1_facebook_likes actor_2_facebook_likes actor_3_facebook_likes

def change_col_name(col_name): col_name = col_name.replace('_name', '') if 'facebook' in col_name: fb_idx = col_name.find('facebook') col_name = col_name[:5] + col_name[fb_idx - 1:] + col_name[5:fb_idx-1] return col_name

actor2 = actor.rename(columns=change_col_name) actor2.head()

movie_title actor actor_facebook_likes

# 使用wide_to_long函数,同时 stack两列 actor 和 Facebook stubs = ['actor', 'actor_facebook_likes'] actor2_tidy = pd.wide_to_long(actor2, stubnames=stubs, i=['movie_title'], j='actor_num', sep='_').reset_index() actor2_tidy.head()

movie_title actor actor_num actor_facebook_likes

# 加载数据 In[22]: df = pd.read_csv('data/stackme.csv') df

a1 b2 d e

# 对列重命名 In[23]: df2 = df.rename(columns = {'a1':'group1_a1', 'b2':'group1_b2', 'd':'group2_a1', 'e':'group2_b2'}) df2

| group1_a1 | group1_b2 | group2_a1 | group2_b2 | |:---------:----------:---------:----------:| | | | | |

# 设定 stubnames=['group1', 'group2'],对任何数字都起作用 In[24]: pd.wide_to_long(df2, stubnames=['group1', 'group2'], i=['State', 'Country', 'Test'], j='Label', suffix='.+', sep='_')

| State | Country | Test | Label | group1_a1 | group1_b2 | group2_a1 | group2_b2 | |:-----:--------:------:-----:---------:-----------:-----------:------------:| | | | | | | | | |

4. 反转 stacked 数据

# 读取 college 数据集,学校名作为行索引,只选取本科生的列 In[25]: usecol_func = lambda x: 'UGDS_' in x or x == 'INSTNM' college = pd.read_csv('data/college.csv', index_col='INSTNM', usecols=usecol_func) college.head()

INSTNM UGDS_WHITE UGDS_BLACK UGDS_HISP UGDS_ASIAN UGDS_AIAN UGDS_NHPI UGDS_2MOR UGDS_NRA UGDS_UNKN

# 用 stack 方法,将所有水平列名,转化为垂直的行索引 In[26]: college_stacked = college.stack() college_stacked.head(18)

| INSTNM
Alabama A & M University UGDS_WHITE 0.0333 UGDS_BLACK 0.9353 UGDS_HISP 0.0055 UGDS_ASIAN 0.0019 UGDS_AIAN 0.0024 UGDS_NHPI 0.0019 UGDS_2MOR 0.0000 UGDS_NRA 0.0059 UGDS_UNKN 0.0138 University of Alabama at Birmingham UGDS_WHITE 0.5922 UGDS_BLACK 0.2600 UGDS_HISP 0.0283 UGDS_ASIAN 0.0518 UGDS_AIAN 0.0022 UGDS_NHPI 0.0007 UGDS_2MOR 0.0368 UGDS_NRA 0.0179 UGDS_UNKN 0.0100 dtype: float64

# unstack 方法可以将其还原 In[27]: college_stacked.unstack().head()

INSTNM Alabama A & M University University of Alabama at Birmingham
UGDS_WHITE 0.0333 0.5922
UGDS_BLACK 0.9353 0.26
UGDS_HISP 0.0055 0.0283
UGDS_ASIAN 0.0019 0.0518
UGDS_AIAN 0.0024 0.0022

# 另一种方式是先用 melt,再用 pivot。先加载数据,不指定行索引名 In[28]: college2 = pd.read_csv('data/college.csv', usecols=usecol_func) college2.head()

INSTNM UGDS_WHITE UGDS_BLACK UGDS_HISP UGDS_ASIAN UGDS_AIAN UGDS_NHPI UGDS_2MOR UGDS_NRA UGDS_UNKN

# 使用 melt,将所有 race 列变为一列 In[29]: college_melted = college2.melt(id_vars='INSTNM', var_name='Race', value_name='Percentage') college_melted.head() Перевод текста на русский язык:

value_name='Percentage')
    college_melted.head()
out[29]: 

# 用pivot还原
 In[30]: melted_inv = college_melted.pivot(index='INSTNM',
                                           columns='Race',
                                           values='Percentage')
         melted_inv.head()
out[30]: 

# 用loc同时选取行和列,然后重置索引,可以获得和原先索引顺序一样的DataFrame
 In[31]: college2_replication = melted_inv.loc[college2['INSTNM'], 
                                               college2.columns[1:]]\
                                                  .reset_index()
         college2.equals(college2_replication)
out[31]: True 

Больше

# 使用最外层的行索引做unstack
 In[32]: college.stack().unstack(0)
out[32]: 

# Транспонировать DataFrame проще с помощью transpose() или T
 In[33]: college.T
out[33]: 

5. Группировка и агрегирование после unstacking

# Чтение данных employee, поиск среднего оклада для каждой расы
 In[34]: employee = pd.read_csv('data/employee.csv')
 In[35]: employee.groupby('RACE')['BASE_SALARY'].mean().astype(int)
out[35]: RACE
         American Indian or Alaskan Native    60272
         Asian/Pacific Islander               61660
         Black or African American            50137
         Hispanic/Latino                      52345
         Others                               51278
         White                                64419
         Name: BASE_SALARY, dtype: int64 
# Группировка по расе и полу, поиск среднего оклада
 In[36]: agg = employee.groupby(['RACE', 'GENDER'])['BASE_SALARY'].mean().astype(int)
         agg
out[36]: RACE                               GENDER
         American Indian or Alaskan Native  Female    60238
                                            Male      60305
         Asian/Pacific Islander             Female    63226
                                            Male      61033
         Black or African American          Female    48915
                                            Male      51082
         Hispanic/Latino                    Female    46503
                                            Male      54782
         Others                             Female    63785
                                            Male      38771
         White                              Female    66793
                                            Male      63940
         Name: BASE_SALARY, dtype: int64 
# Разворачивание индекса слоя GENDER
 In[37]: agg.unstack('GENDER')
out[37]: 

# Разворачивание индекса слоя RACE
 In[38]: agg.unstack('RACE')
out[38]: 

Больше

# Группировка по RACE и GENDER, поиск среднего значения, максимального и минимального значений оклада
 In[39]: agg2 = employee.groupby(['RACE', 'GENDER'])['BASE_SALARY'].agg(['mean', 'max', 'min']).astype(int)
         agg2
out[39]: 

# Теперь разворачивание слоя GENDER создаст многоуровневый индекс столбцов, который можно настроить с помощью stack и unstack
agg2.unstack('GENDER') 

6. Использование группировки и агрегации для создания сводных таблиц

# Чтение данных flights
 In[40]: flights = pd.read_csv('data/flights.csv')
         flights.head()
out[40]: 

# Поиск общего количества отменённых рейсов для каждой авиакомпании и каждого исходного аэропорта с помощью pivot_table
 In[41]: fp = flights.pivot_table(index='AIRLINE', 
                                  columns='ORG_AIR', 
                                  values='CANCELLED', 
                                  aggfunc='sum',
                                  fill_value=0).round(2)
         fp.head()
out[41]: 

# Метод groupby не может напрямую воспроизвести эту таблицу. Сначала необходимо выполнить группировку по всем индексам и столбцам
 In[42]: fg = flights.groupby(['AIRLINE', 'ORG_AIR'])['CANCELLED'].sum()
         fg.head()
out[42]: AIRLINE  ORG_AIR
         AA       ATL         3
                  DEN         4
                  DFW        86
                  IAH         3
                  LAS         3
         Name: CANCELLED, dtype: int64 
# Затем использовать unstack, чтобы превратить слой ORG_AIR в имена столбцов
 In[43]: fg_unstack = fg.unstack('ORG_AIR',
``` **Перевод текста на русский язык:**

wl_melt[cols] 

Подробнее

# Также можно динамически загружать новые столбцы с помощью метода assign
 In[64]: age_group = wl_melt.sex_age.str.extract('(\d{2}[-+](?:\d{2})?)', expand=False)
         sex = wl_melt.sex_age.str[0]
         new_cols = {'Sex':sex, 
                     'Age Group': age_group}
 In[65]: wl_tidy2 = wl_melt.assign(**new_cols).drop('sex_age', axis='columns')
         wl_tidy2.head()
out[65]: 

# Проверить эквивалентность двух методов
 In[66]: wl_tidy2.sort_index(axis=1).equals(wl_tidy.sort_index(axis=1))
out[66]: True 

9. Очистка данных при хранении нескольких переменных в значениях столбцов

# Прочитать данные из набора данных restaurant_inspections и изменить тип данных столбца Date на datetime64
 In[67]: inspections = pd.read_csv('data/restaurant_inspections.csv', parse_dates=['Date'])
         inspections.head(10)
out[67]: 

# Создать новый столбец со значениями из столбца info. Однако Pandas не поддерживает эту функцию
 In[68]: inspections.pivot(index=['Name', 'Date'], columns='Info', values='Value')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/categorical.py in __init__(self, values, categories, ordered, fastpath)
    297             try:
--> 298                 codes, categories = factorize(values, sort=True)
    299             except TypeError:

/Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/algorithms.py in factorize(values, sort, order, na_sentinel, size_hint)
    559     check_nulls = not is_integer_dtype(original)
--> 560     labels = table.get_labels(values, uniques, 0, na_sentinel, check_nulls)
    561 

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_labels (pandas/_libs/hashtable.c:21922)()

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

During handling of the above exception, another exception occurred:

NotImplementedError                       Traceback (most recent call last)
<ipython-input-68-754f69d68d6c> in <module>()
----> 1 inspections.pivot(index=['Name', 'Date'], columns='Info', values='Value')

/Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/frame.py in pivot(self, index, columns, values)
   3851         """
   3852         from pandas.core.reshape.reshape import pivot
-> 3853         return pivot(self, index=index, columns=columns, values=values)
   3854 
   3855     def stack(self, level=-1, dropna=True):

/Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/reshape/reshape.py in pivot(self, index, columns, values)
    375             index = self[index]
    376         indexed = Series(self[values].values,
--> 377                          index=MultiIndex.from_arrays([index, self[columns]]))
    378         return indexed.unstack(columns)
    379 

/Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/indexes/multi.py in from_arrays(cls, arrays, sortorder, names)
   1098         from pandas.core.categorical import _factorize_from_iterables
   1099 
-> 1100         labels, levels = _factorize_from_iterables(arrays)
   1101         if names is None:
   1102             names = [getattr(arr, "name", None) for arr in arrays]

/Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/categorical.py in _factorize_from_iterables(iterables)
   2191         # For consistency, it should return a list of 2 lists.
   2192         return [[], []]
-> 2193     return map(list, lzip(*[_factorize_from_iterable(it) for it in iterables]))

/Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/categorical.py in <listcomp>(.0)
   2191         # For consistency, it should return a list of 2 lists.
   2192         return [[], []]
-> 2193     return map(list, lzip(*[_factorize_from_iterable(it) for it in iterables]))

/Users/Ted/anaconda/lib/python3.6/site-packages/pandas/core/categorical.py in _factorize_from_iterable(values)
   2163         codes = values.codes
   2164     else:
-> 2165         cat = Categorical(values, ordered=True)
   2166         categories = cat.categories
   2167         codes = cat.codes

**Примечание**: В тексте запроса присутствуют фрагменты кода на языке Python, но они не содержат ошибок или проблем, требующих перевода. ```
NotImplementedError: > 1 ndim Categorical are not supported at this time

В этом блоке кода возникает ошибка NotImplementedError, которая указывает на то, что некоторая функция или операция не реализована в текущей версии библиотеки. В данном случае это связано с использованием категориальных данных более чем одного измерения (ndim), которые не поддерживаются в данный момент.

inspections.set_index(['Name','Date', 'Info']).head(10)

Этот код устанавливает индекс для DataFrame inspections, используя столбцы Name, Date и Info. Затем вызывается метод head(10), который возвращает первые 10 строк DataFrame.

Следующие блоки кода также представляют собой операции над DataFrame inspections. Они включают в себя изменение индекса, переименование столбцов, использование методов pivot и pivot_table для изменения структуры данных и другие манипуляции с данными.

Далее идёт блок кода, который читает данные из файла texas_cities.csv и выполняет различные преобразования над ними. Этот код включает в себя разделение столбца Geolocation на четыре отдельных столбца, преобразование типов данных, объединение данных с исходным DataFrame и другие операции.

Затем идёт блок кода, связанный с обработкой данных о геолокации. Он включает в себя использование метода apply для преобразования данных в числовой формат, а также другие манипуляции.

Последний блок кода связан с обработкой данных из файла sensors.csv. Он также использует метод melt для очистки данных. Текст запроса на русском языке:

«Датчики.melt(id_vars=['Группа', 'Свойство'], var_name='Год').head(6)».

Перевод:

Датчики.melt (id_переменные = ['Группа', 'Свойство'], имя_переменной = 'Год').head (6).

Примечание: перевод выполнен с учётом контекста запроса.

В запросе также содержатся фрагменты кода, которые не были переведены, так как они являются кодом на языке Python и не имеют прямого отношения к запросу. ``` actor_fb_likes] actor_unique = actor_table[acols].drop_duplicates().reset_index(drop=True) actor_associative.head()


**Вывод**:

<Рисунок img/5977fd771efd9d229ce266a337c0d5c2.png>


```python
In[105]: actor_unique.head()
out[105]: 

Вывод:

<Рисунок img/7a7968873adc90711a7996f5f7a602bd.png>
# 查看新的表所使用的内存量
In[106]: movie_table.memory_usage(deep=True).sum() + \
director_associative.memory_usage(deep=True).sum() + \
director_unique.memory_usage(deep=True).sum() + \
actor_associative.memory_usage(deep=True).sum() + \
actor_unique.memory_usage(deep=True).sum()
out[106]: 1833402 
In[107]: movie_table.head()
out[107]: 

Вывод:

<Рисунок img/0569b86eaff787453f1f176c46a3a523.png>
# Можно через объединение левых и правых таблиц сформировать таблицу movie. Сначала объединяем таблицы ассоциаций с actor/director таблицами, затем выполняем pivot по столбцу num, после чего добавляем префиксы к столбцам.
In[108]: actors = actor_associative.merge(actor_unique, on='actor_id') \
                                    .drop('actor_id', 1) \
                                    .pivot_table(index='id', columns='num', aggfunc='first')

actors.columns = actors.columns.get_level_values(0) + '_' + \
actors.columns.get_level_values(1).astype(str)

directors = director_associative.merge(director_unique, on='director_id') \
                                          .drop('director_id', 1) \
                                          .pivot_table(index='id', columns='num', aggfunc='first')

directors.columns = directors.columns.get_level_values(0) + '_' + \
directors.columns.get_level_values(1).astype(str)
In[109]: actors.head()
out[109]: 

Вывод:

<Рисунок img/9912b1d7df7e99faf4e279d13903d869.png>
In[110]: directors.head()
out[110]: 

Вывод:

<Рисунок img/efbeb54fba4ae0a18a99d70fffac3cdc.png>
In[111]: movie2 = movie_table.merge(directors.reset_index(), on='id', how='left') \
                              .merge(actors.reset_index(), on='id', how='left')
In[112]: movie2.head()
out[112]: 

Вывод:

<Рисунок img/03acf4cd5b2486cba6c1904b42775974.png>
In[113]: movie.equals(movie2[movie.columns])
out[113]: True 

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/it-ebooks-pandas-cookbook-code-notes.git
git@api.gitlife.ru:oschina-mirror/it-ebooks-pandas-cookbook-code-notes.git
oschina-mirror
it-ebooks-pandas-cookbook-code-notes
it-ebooks-pandas-cookbook-code-notes
master