Считать разделители в CSV-рядах с помощью панд

У меня есть CSV файл следующим образом:

name,age
something
tom,20

И когда я помещаю его в фрейм данных, это выглядит так:

df = pd.read_csv('file', header=None)

     0           1
1    name        age
2    something   NaN
3    tom         20

Как бы я получить количество запятой в необработанных данных строки. Например, ответ должен выглядеть так:

# 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

Ответы

Ответ 1

Делая это

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()

Данные

name,age
something
tom,20
something,,,,,somethingelse

Ответ 2

Очень просто прочитать ваши данные как один столбец, затем разделить их запятыми и объединить с разделителем.

# 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

Другое решение для конкатенации - join к индексу (это аккуратная строка):

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

Ответ 3

Попробуйте код ниже

df = pd.read_csv('file', header=None)
df['_count_separators'] = df.count(axis='columns')
print(df)
output: 
     0           1      _count_separators
1    name        age   1
2    something   NaN   0
3    tom         20    1

Ответ 4

Гораздо менее красивый подход не-панд. Вы можете прочитать CSV файл с помощью csv.DictReader подсчитать количество непустых значений и вычесть 1:

import csv

import pandas as pd


with open('input.csv') as f:
    reader = csv.DictReader(f, fieldnames=['column1', 'column2'])

    data = []
    for line in reader:
        line['_count_separators'] = sum(1 for value in line.values() if value) - 1
        data.append(line)


df = pd.DataFrame(data)
print(df)

Печать:

     column1 column2  _count_separators
0       name     age                  1
1  something    None                  0
2        tom      20                  1

Ответ 5

Просто прочитайте его как обычный файл и относитесь к нему как к строке. Затем используйте метод count, который существует в строковом объекте.

with open('file', 'r') as file:
    string = file.read()

comma_counts = string.count(',')

Ответ 6

Одна строка кода: len(df) - df[1].isna().sum()

Ответ 7

Вы можете использовать модуль csv для подсчета разделителей. Это двухпроходное решение, но не обязательно неэффективное по сравнению с альтернативными однопроходными.

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