Считать разделители в 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