Поиск по блогу

среда, 15 апреля 2015 г.

Методы Pandas для работы со столбцами

Когда начинаешь использовать DataFrame, то возникают десятки "мелких вопросов. Как переименовать столбцы? Как изменить порядок столбцов (чтобы склеить таблицы)? Как фильтровать строки по содержанию ячеек? Как использовать для этого регулярные выражения? Типы столбцов? Вот пример команды для извлечения списка столбцов: "cols = list(df.columns.values) StringIO
Здесь есть и такие фишки, как команды считывание в DataFrame из буфера обмена, из ячейки Ipython ... И это приводит к размышлениям о том, что иногда проще скопипастить фрагмент прямо сюда в Notebook

Как отфильтровать строки Pandas selecting data with specific conditions

In [ ]:
item    storage
record  paper
record  laptop
record  desktop
file    laptop
file    paper
file    paper
record  desktop
file    desktop
In [ ]:
>>> df[(df['item'] == 'record') & (df['storage'].isin(['laptop', 'desktop']))]
     item  storage
1  record   laptop
2  record  desktop
6  record  desktop
In [ ]:
 
In [4]:
import os
import pandas as pd
import numpy as np
In [ ]:
DIRPATH = '/media/MYLINUXLIVE/Documents/Xpdf/aerbu_2014_all_csv/3aug2/'
In [ ]:
 
In [ ]:
COLNAMES_0_11 =['Model', 'Brandt', \
           '2014y3', '2013y3', 'u1413y3', '1413y3', \
           '2014m3', '2013m3', 'u1413m3', '1413m3', 'Datem']
In [ ]:
.to_string()
In [ ]:
.dtypes
In [5]:
df = pd.DataFrame(np.random.rand(10, 5))
In [6]:
df['mean'] = df.mean(1)
In [7]:
df
Out[7]:
0 1 2 3 4 mean
0 0.199430 0.004379 0.758607 0.915156 0.578548 0.491224
1 0.110907 0.034183 0.325610 0.614940 0.425287 0.302185
2 0.519244 0.898271 0.965476 0.502989 0.623608 0.701918
3 0.931016 0.587524 0.358757 0.449380 0.337074 0.532750
4 0.503916 0.190626 0.742473 0.817847 0.826689 0.616310
5 0.015935 0.933482 0.825417 0.528403 0.641038 0.588855
6 0.560369 0.718956 0.940010 0.122594 0.781929 0.624771
7 0.273829 0.882852 0.916688 0.374100 0.287967 0.547087
8 0.409924 0.062183 0.598533 0.093149 0.448012 0.322360
9 0.120511 0.209894 0.506234 0.277057 0.064992 0.235738

Надо обязательно проверять, как называются столбцы. Вот этой командой:

In [11]:
cols = list(df.columns.values)
cols
Out[11]:
[0L, 1L, 2L, 3L, 4L, 'mean']

Теперь можно очень просто поменять порядок столбцов, задав список столбцов, однако, если хоть одно имя не совпадет, тововзникнет ошибка:

In [16]:
df_1 = df[['mean', 0L, 1L]]
df_1.tail(3)
Out[16]:
mean 0 1
7 0.547087 0.273829 0.882852
8 0.322360 0.409924 0.062183
9 0.235738 0.120511 0.209894
In [ ]:
####А можно ли поменять порядок, обращаясь по номерам столбцов?
In [18]:
df[0].head(3)
Out[18]:
0    0.199430
1    0.110907
2    0.519244
Name: 0, dtype: float64

df[4,0].head(3) # выдает ошибку

Напомним, что такая запись вырезает строки, а не столбцы...

In [25]:
df[2:5]
Out[25]:
0 1 2 3 4 mean
2 0.519244 0.898271 0.965476 0.502989 0.623608 0.701918
3 0.931016 0.587524 0.358757 0.449380 0.337074 0.532750
4 0.503916 0.190626 0.742473 0.817847 0.826689 0.616310

Выше мы создали df_1 = df[['mean', 0L, 1L]], чтобы поменять имена столбцов достаточно их просто присвоить

In [15]:
df_1.columns = ['mean', 'a', 'b']
df_1.head(3)
Out[15]:
mean a b
0 0.491224 0.199430 0.004379
1 0.302185 0.110907 0.034183
2 0.701918 0.519244 0.898271

Здесь примеры приводить не будем, лучше просмотреть ссылки... не только в заголовке, но и в начале поста. Они очень удачно подобраны.

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

isin() is ideal if you have a list of exact matches, but if you have a list of partial matches or substrings to look for, you can filter using the str.contains method and regular expressions.

For example, if we want to return a DataFrame where all of the stock IDs which begin with '600' and then are followed by any three digits:

In [ ]:
>>> rpt[rpt['STK_ID'].StringIO(r'^600[0-9]{3}$')] # ^ means start of string
...   STK_ID   ...                                    # [0-9]{3} means any three digits
...  '600809'  ...                                    # $ means end of string
...  '600141'  ...
...  '600329'  ...

was wondering if there is an elegant and shorthand way in Pandas DataFrames to select columns by data type (dtype). i.e. Select only int64 columns from a DataFrame.

In [ ]:
#To elaborate, something along the lines of 
#df.select_columns(dtype=float64)
In [ ]:
df.loc[:, df.dtypes == np.float64]
In [ ]:
df.select_dtypes(include=[np.float64])
In [ ]:
#Since 0.14.1 there's a select_dtypes method so you can do this more elegantly/generally.

In [11]: df = pd.DataFrame([[1, 2.2, 'three']], columns=['A', 'B', 'C'])

In [12]: df.select_dtypes(include=['int'])
Out[12]:
   A
0  1

#    To select all numeric types use the numpy dtype numpy.number

In [13]: df.select_dtypes(include=[np.number])
Out[13]:
   A    B
0  1  2.2

In [14]: df.select_dtypes(exclude=[object])
Out[14]:
   A    B
0  1  2.2

First off just to demonstrate that reading this in is fine:

In [ ]:
   pgtime  pgstat  age  eet     g2  grade  gleason      ploidy
1     6.1       0   64    2  10.26      2        4     diploid
2     9.4       0   62    1    NaN      3        8   aneuploid
3     5.2       1   59    2   9.99      3        7     diploid
4     3.2       1   62    2   3.57      2        4     diploid
5     1.9       1   64    2  22.56      4        8  tetraploid
6     4.8       0   69    1   6.14      3        7     diploid
7     5.8       0   75    2  13.69      2      NaN  tetraploid
8     7.3       0   71    2    NaN      3        7   aneuploid
9     3.7       1   73    2  11.77      3        6     diploid

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

In [45]:
df1 = pd.read_clipboard(sep= '\s+')    #sep= '\s*' ,  delim_whitespace=True , error_bad_lines=False

Причем, работает вот этот простой вариант. Справа в комментарии то, что пришлось попробовать и убрать...

In [46]:
df1
Out[46]:
pgtime pgstat age eet g2 grade gleason ploidy
1 6.1 0 64 2 10.26 2 4 diploid
2 9.4 0 62 1 NaN 3 8 aneuploid
3 5.2 1 59 2 9.99 3 7 diploid
4 3.2 1 62 2 3.57 2 4 diploid
5 1.9 1 64 2 22.56 4 8 tetraploid
6 4.8 0 69 1 6.14 3 7 diploid
7 5.8 0 75 2 13.69 2 NaN tetraploid
8 7.3 0 71 2 NaN 3 7 aneuploid
9 3.7 1 73 2 11.77 3 6 diploid
In [ ]:
df = pd.read_table(StringIO(raw),header=0,skiprows=2,sep=",", warn_bad_lines=False, error_bad_lines=False)
In [ ]:
 

Пример чтения данных из ячейки notebook вместе с кавычками Escaped quotes in pandas read_csv

In [47]:
data = '''SEARCH_TERM,ACTUAL_URL
"bra tv bord","http://www.ikea.com/se/sv/catalog/categories/departments/living_room/10475/?se%7cps%7cnonbranded%7cvardagsrum%7cgoogle%7ctv_bord"
"tv p\xc3\xa5 hjul","http://www.ikea.com/se/sv/catalog/categories/departments/living_room/10475/?se%7cps%7cnonbranded%7cvardagsrum%7cgoogle%7ctv_bord"
"SLAGBORD, \\"Bergslagen\\", IKEA:s 1700-tals serie","http://www.ikea.com/se/sv/catalog/categories/departments/living_room/10475/?se%7cps%7cnonbranded%7cvardagsrum%7cgoogle%7ctv_bord"'''
In [50]:
from cStringIO import StringIO

Не забыть импортировать StringIO. Этот прием можно использовать чаще.

In [51]:
dfio = pd.read_csv(StringIO(data), escapechar='\\', encoding='utf-8')
In [52]:
dfio
Out[52]:
SEARCH_TERM ACTUAL_URL
0 bra tv bord http://www.ikea.com/se/sv/catalog/categories/d...
1 tv på hjul http://www.ikea.com/se/sv/catalog/categories/d...
2 SLAGBORD, "Bergslagen", IKEA:s 1700-tals serie http://www.ikea.com/se/sv/catalog/categories/d...

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



Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий