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
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.
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.
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])]
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()
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])
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())
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()
a = [1,2,3,4,5]
pd.DataFrame({'hello': a})
>>>
hello
0 1
1 2
2 3
3 4
4 5
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"}]'
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.
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))
pd.DataFrame.assig()
df['a'], df['b'] = value_a, valueb
Utilisez plutôt assign
df.assign(a=value_a, b=value_b)
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]
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])
>>> 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])
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)
def df_sort(df):
return df.reindex(sorted(df.columns), axis=1)
df.columns.str.contains('required string')
df.apply(lambda x: x.isnull().sum(), axis=0)
Utilisez pd.get_dummies ()
Recommended Posts