[PYTHON] [Mémo] Petite histoire de pandas, stupide

Un mémo d'une petite histoire qui semble être utilisée souvent mais qui n'est pas utilisée, et il existe de nombreuses autres façons de l'oublier immédiatement

1. Comptez le nombre d'échantillons par jour

Supposons que vous ayez un dataframe de type horodatage.

timestamp  score
2013-06-29 00:52:28+00:00        -0.420070
2013-06-29 00:51:53+00:00        -0.445720
2013-06-28 16:40:43+00:00         0.508161
2013-06-28 15:10:30+00:00         0.921474
2013-06-28 15:10:17+00:00         0.876710

Je veux vérifier le nombre d'échantillons par jour comme ça.

            score
2013-06-28      3
2013-06-29      2

Je veux préparer un tableau vide, grouper par jour, vérifier le nombre d'échantillons avec count, l'ajouter avec une instruction for et faire le travail pénible en une seule ligne.

df.groupby(df.index.date).count()

Vous pouvez facilement le traiter en passant l'index de dataframe à pd.DataFrame.groupby ().

example1.py


import io
import pandas as pd
content = '''\
timestamp  score
2013-06-29 00:52:28+00:00        -0.420070
2013-06-29 00:51:53+00:00        -0.445720
2013-06-28 16:40:43+00:00         0.508161
2013-06-28 15:10:30+00:00         0.921474
2013-06-28 15:10:17+00:00         0.876710
'''

df = pd.read_table(io.BytesIO(content), sep='\s{2,}', parse_dates=[0], index_col=[0])

print(df)

print(df.groupby(df.index.date).count())

En ce qui concerne le traitement lourd, nous avons tendance à éviter group by (), mais il peut être compatible avec datetime.

2. Je souhaite rechercher dans les colonnes de pd.DataFrame plusieurs parties qui correspondent à la chaîne de caractères cible.

S'il existe un bloc de données avec une telle colonne,

print df.columns

Index([u'A_0', u'A_1', u'A_2', u'B_0', u'B_1', u'B_2', u'C_0', u'C_1', u'C_2', u'C_3'], dtype='object', length=121)

Par exemple, je souhaite filtrer uniquement la colonne «B_» à partir de là. Il existe différentes correspondances de chaînes, mais vous pouvez utiliser find

df.ix[:, np.where(df.columns.str.find('B')==0)[0]]

str.find () renvoie la liste avec T / F, donc retirez-la avec ix telle quelle.

3. Extrayez les colonnes / lignes contenant plusieurs valeurs spécifiques du bloc de données en utilisant la liste comme condition de filtrage.

df[df.A > 0]

Je voudrais utiliser une telle expression conditionnelle commune avec une liste comme condition. Vous pouvez le faire tout de suite avec isin.

df[df['A'].isin([0, 1, 2, 3])]

La même opération peut être effectuée avec numpy.

a = np.array([0,1,2,3])
a[np.isin(a,[1,2,5,7])]

4. Sous-échantillonner les données avec un espacement réduit des échantillons

Utilisez pandas.DatatimeIndex et rééchantillonnez Supposons que vous ayez les données suivantes avec des horodatages où l'intervalle d'échantillonnage n'est pas constant.

['2016-11-11 01:41:29', '2016-11-11 01:41:31',
'2016-11-11 01:41:32', '2016-11-11 01:41:33',
'2016-11-11 01:41:34', '2016-11-11 01:41:35',
'2016-11-11 01:41:36', '2016-11-11 01:41:37',
'2016-11-11 01:41:38', '2016-11-11 01:41:38',...

Le sous-échantillonnage à l'aide de groupby prend trop de temps, donc le sous-échantillonnage est plus léger.

x['date'] = pd.to_datetime(x.date)
X = x.copy().set_index('date')

Remplacez la date par pd.DatetimeIndex avec to_timestamp. Réglez la date à indexer.

X.resample('5S').dropna()

DatetimeIndex peut être facilement sous-échantillonné en rééchantillonnant avec une fréquence comme celle-ci.

5. Convertissez la matrice triangulaire en tableau

Supposons que vous ayez une telle matrice triangulaire supérieure à portée de main.

A = array([[ 4,  0,  3],
           [ 0,  4, -2],
           [ 0,  0,  7]])

Je veux obtenir une liste de valeurs comme celle-ci.

[4, 0, 3, 4, -2, 7]

Résolu avec numpy.triu_indies ().

>>> A[np.triu_indices(3)]
array([ 4,  0,  3,  4, -2,  7])

Lors de la suppression des valeurs diagonales courantes dans les cartes thermiques, etc., un ajustement est possible en spécifiant k.

>>> A[np.triu_indices(3, k=1)]
array([ 0,  3, -2])

6. Simplifier le comptage des éléments

Pour compter les données (créer un histogramme)

labels = pd.Series(['A', 'B', 'C', 'A', 'C', 'A'])
0    A
1    B
2    C
3    A
4    C
5    A

Utilisez defaultdict pour ce faire.

from collections import Counter, defaultdict
counts = defaultdict(int)
for l in labels:
    for l2 in l:
        counts[l2] += 1

La sortie ressemble à ceci. defaultdict(<class 'int'>, {'A': 3, 'B': 1, 'C': 2})

Avec les pandas, vous pouvez le faire plus facilement avec group by, mais si vous souhaitez compter les balises imbriquées comme celle ci-dessous, vous pouvez facilement extraire en ajoutant simplement une instruction for.

labels = pd.Series([['A', 'B'], ['C', 'A'],[ 'C', 'A', 'D'], ['D', 'A', 'B']])

from collections import Counter, defaultdict
counts = defaultdict(int)
for l in labels:
    for l2 in l:
        counts[l2] += 1

Bien entendu, la clé et la valeur de la valeur de retour peuvent être répertoriées comme suit.

list(counts.keys())
list(counts.values())

7. Notation d'inclusion de liste imbriquée

Pour tourner le nid avec for, écrivez comme suit.

[x for inner_list in [[1, 3], [5], [7, 9]] for x in inner_list]
>>> [1, 3, 5, 7, 9]

En passant, vous pouvez également l'utiliser pour créer l'histogramme imbriqué décrit dans "6. Simplifier les éléments de comptage".

pd.DataFrame({'numbers':numbers}).groupby('numbers').size().plot.bar()
スクリーンショット 2017-07-18 17.33.04.png

8. Dans Pandas DataFrame, saisissez des données tout en donnant des noms de colonne

a = [1,2,3,4,5]
pd.DataFrame({'hello': a})
>>>
 	hello
0	1
1	2
2	3
3	4
4	5

9. Créez un Json à partir de plusieurs listes

Créez json à partir de la liste.

a=["USA","France","Italy"]
b=["10","5","6"]

À partir de cette liste, je souhaite créer le fichier json suivant.

[{'country': 'USA', 'wins': '10'},
 {'country': 'France', 'wins': '5'},
 {'country': 'Italy', 'wins': '6'}]

Il existe deux méthodes. Le premier est la compréhension de la liste

>>> [{'country': country, 'wins': wins} for country, wins in zip(a, b)]
[{'country': 'USA', 'wins': '10'},
 {'country': 'France', 'wins': '5'},
 {'country': 'Italy', 'wins': '6'}]

Le second est json dump

>>> json.dumps(
...     [{'country': country, 'wins': wins} for country, wins in zip(a, b)]
... )
'[{"country": "USA", "wins": "10"}, {"country": "France", "wins": "5"}, {"country": "Italy", "wins": "6"}]'

10. Chargez jsonl avec DataFrame

Je veux lire jsonl avec différents nombres d'éléments sur une ligne sans passer par le type de dictionnaire.

json_string = '{"first_name": "Guido", "last_name":"Rossum"}, {"first_name": "Guido", "last_name":"Terry", "test_name": "test-man"}'
parsed_json = pd.read_json(json_string, lines=True)
print(parsed_json)
first_name last_name test_name
0 Guido Rossum NaN
1 Guido Terry test-man

Si vous utilisez pd.read_json (lines = True), vous pouvez lire la ligne json proprement.

11. Créez un json en couches à partir de la liste

Je veux créer le Json suivant.

{'filename': 'filename',
 'data': [{'keyword': 'bomber',
   'term_freq': 5,
   'lists': [{'occurrance': 1},
    {'occurrance': 2},
    {'occurrance': 3},
    {'occurrance': 4},
    {'occurrance': 5}]},
  {'keyword': 'irritation',
   'term_freq': 5,
   'lists': [{'occurrance': 1},
    {'occurrance': 3},
    {'occurrance': 5},
    {'occurrance': 7},
    {'occurrance': 8}]}]}

Utilisez dict.

import json

dic = {
        "bomber": [1, 2, 3, 4, 5],
        "irritation": [1, 3, 5, 7, 8]
      }


json_dict = {}
data = []

#création de données
for k, v in dic.items():
    tmp_dict = {}
    
    #Ajouter un mot-clé
    tmp_dict["keyword"] = k
    
    #Ajouter la longueur de la liste
    tmp_dict["term_freq"] = len(v)
    
    #Ajouter un mot-clé au contenu de la liste
    tmp_dict["lists"] = [{"occurrance": i} for i in v]
    
    data.append(tmp_dict)

json_dict["filename"] = 'filename'
json_dict["data"] = data

print(json.dumps(json_dict))

12. Stockez plusieurs valeurs initiales en tant que nouvelles colonnes

pd.DataFrame.assig()

df['a'], df['b'] = value_a, valueb

Utilisez plutôt assign

df.assign(a=value_a, b=value_b)

13. Je souhaite récupérer rapidement les valeurs d'un DataFrame

S'il s'agit de pd.DataFrame.loc [0,0] ou pd.DataFrame.values, le type de tableau est généré.

Utilisez pd.DataFrame.iat [0,0]

14. Économisez régulièrement des opérations lourdes

Divisez la ligne DF en sections régulières et faites to_csv () La méthode de la division égale est la suivante

x = 17
n = 3
l = [(x + i) // n for i in range(n)]
l
>>> [5, 6, 6]

Réécrivez ce qui suit dans _csv

#Créer un DF approprié pour les tests
df = pd.DataFrame(data={
    'a': range(10),
    'b': list(map(lambda x: x/5, list(range(10))))
})

test = []
for num in range(n):
    begin = sum(l[:num])
    end = sum(l[:(num+1)])
    test.append(df.iloc[begin:end])

15. Je souhaite exclure plusieurs éléments d'une liste

>>> a = range(1, 10)
>>> [x for x in a if x not in [2, 3, 7]]
[1, 4, 5, 6, 8, 9]

Il semble que cela puisse aussi être fait

x = set(range(10))
y = x - set([2, 3, 7])
# y = set([0, 1, 4, 5, 6, 8, 9])
  1. Set list into DataFrame as value La liste peut ne pas être stockée dans le DF.
df = pd.DataFrame(data={
    'a': [1, 2],
    'b': [2, 3]
})
df['c'] = [[3]]

Puisqu'une erreur se produit ci-dessus, exécutez comme suit.

df = pd.DataFrame(data={
    'a': [1, 2],
    'b': [2, 3]
})
df['c'] = [[3]] * len(df)

17. Organisez l'ordre des colonnes

def df_sort(df):
    return df.reindex(sorted(df.columns), axis=1)

18. Rechercher des chaînes de caractères à partir des noms de colonnes

df.columns.str.contains('required string')

19. pd.DataFrame.to_json () orient table de référence rapide

Screen Shot 2018-11-01 at 14.32.14.png

20. Compter les valeurs manquantes dans toutes les colonnes à la fois

df.apply(lambda x: x.isnull().sum(), axis=0)

21. Je souhaite utiliser OneHotEncorder

Utilisez pd.get_dummies ()

Recommended Posts

[Mémo] Petite histoire de pandas, stupide
Petite histoire: mécanisme d'aplatissement numpy
Mémo Pandas
[Python] Mémo d'opération de pandas DataFrame
mémo pandas
[Python] Mémo Numpy
[Petite histoire] Téléchargez l'image de Ghibli immédiatement
À propos de tout numpy
Mémo de calcul de base Numpy
Mémo inversé Pandas
Fonctionnement de base des pandas
À propos de MultiIndex of Pandas
petite histoire de python
Fonctionnement de base des Pandas
L'histoire de sys.path.append ()
[Exercice Numpy / pandas / matplotlib 01]
Fonction de réglage NumPy
[Memo] Chargez le csv de s3 dans les pandas avec boto3
Python Basic --Pandas, Numpy-
Somme de plusieurs tableaux numpy (somme)
L'histoire de la construction de Zabbix 4.4
Histoire de niveau programme de libscips ① (α0.0.1)
Mémo Qiita de mes pensées
Caractéristiques du langage de programmation [Memo]
Un petit mémorandum d'openpyxl
[Memo] Construction de l'environnement cygwin
À propos de tout numpy (2e)
Mon mémo numpy / scipy inversé
Petite collection d'histoires App Service
Mémo de visualisation par pandas, seaborn
Résumé de l'utilisation de base de Pandas
Comportement de la méthode pandas rolling ()
Index d'utilisation de certains pandas
Le pouvoir des pandas: Python