私は次のように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
非常に簡単に、データを単一の列シリーズとして読み取り、コンマで分割し、区切り文字の数と連結します。
# 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
連結のもう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
これを行う
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
区切り文字のカウントには csv
モジュールを使用できます。これは2パスソリューションですが、代替の1パスソリューションと比べて必ずしも非効率的ではありません。
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行のコード:len(df) - df[1].isna().sum()