web-dev-qa-db-de.com

Zählen Sie Trennzeichen in CSV-Zeilen mit Pandas

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
14
David L

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
10
coldspeed

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
8
Wen-Ben

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
1
jpp

Eine Codezeile: len(df) - df[1].isna().sum()

0
Quang Hoang