Ich habe eine CSV-Datei wie folgt:
name,age
something
tom,20
Und wenn ich es in einen Datenrahmen stecke, sieht es so aus:
df = pd.read_csv('file', header=None)
0 1
1 name age
2 something NaN
3 tom 20
Wie kann ich die Anzahl der Kommas in den rohen Zeilendaten ermitteln? Zum Beispiel sollte die Antwort so aussehen:
# in pseudocode
df['_count_separators'] = len(df.raw_value.count(','))
0 1 _count_separators
1 name age 1
2 something NaN 0
3 tom 20 1
Lesen Sie Ihre Daten ganz einfach als eine einzige Spaltenserie, teilen Sie sie dann in Kommas auf und verketten Sie sie mit der Anzahl der Trennzeichen.
# s = pd.read_csv(pd.compat.StringIO(text), sep=r'|', squeeze=True, header=None)
s = pd.read_csv('/path/to/file.csv', sep=r'|', squeeze=True, header=None)
pd.concat([
s.str.split(',', expand=True),
s.str.count(',').rename('_count_sep')
], axis=1)
0 1 _count_sep
0 name age 1
1 something None 0
2 tom 20 1
Eine andere Lösung für die Verkettung ist join
für den Index (dies ist ein ordentlicher Liner):
s.str.split(',', expand=True).join(s.str.count(',').rename('_count_sep'))
0 1 _count_sep
0 name age 1
1 something None 0
2 tom 20 1
Dies tun
df = pd.read_csv('file', header=None)
df2 = pd.read_csv('file', header=None,sep='|') # using another sep for read your csv again
df2['0'].str.findall(',').str.len() # then one row into one cell , using str find
0 1
1 0
2 1
3 5
Name: 0, dtype: int64
df['_count_separators']=df2['0'].str.findall(',').str.len()
Daten
name,age
something
tom,20
something,,,,,somethingelse
Sie können das Modul csv
für die Zählzeichen verwenden. Dies ist eine Lösung mit zwei Durchgängen, die jedoch im Vergleich zu alternativen Eindurchgangslösungen nicht unbedingt ineffizient ist.
from io import StringIO
import csv, pandas as pd, numpy as np
x = """name,age
something
tom,20"""
# replace StringIO(x) with open('file.csv', 'r')
with StringIO(x) as fin:
delim_counts = np.fromiter(map(len, csv.reader(fin)), dtype=int)
# replace StringIO(x) with 'file.csv'
df = pd.read_csv(StringIO(x), header=None)
df['_count_separators'] = delim_counts - 1
print(df)
0 1 _count_separators
0 name age 1
1 something NaN 0
2 tom 20 1
Eine Codezeile: len(df) - df[1].isna().sum()