web-dev-qa-db-ja.com

Pandas)を使用して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
13
user10503628

非常に簡単に、データを単一の列シリーズとして読み取り、コンマで分割し、区切り文字の数と連結します。

# 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
8
cs95

これを行う

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
6
WeNYoBen

区切り文字のカウントには 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
0
jpp

1行のコード:len(df) - df[1].isna().sum()

0
Quang Hoang