【问题标题】:Count separators in CSV rows with Pandas使用 Pandas 计算 CSV 行中的分隔符
【发布时间】:2019-05-20 15:01:49
【问题描述】:

我有一个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

【问题讨论】:

  • 如果逗号在列值中,您是否还要计算逗号?
  • @OmkarSabade 最好只是为了得到pandas 推断的分隔符的数量——但任何一种方式都是可以接受的。
  • 我希望有这样的格式:1????tom????20????tom@doe.com

标签: python python-3.x pandas csv dataframe


【解决方案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

连接的另一种解决方案是索引上的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

【讨论】:

  • @W-B 是的,直到我发布...伟大的思想......嗯? ;)
  • 你的回答阻止了我的想法
【解决方案2】:

这样做

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

【讨论】:

    【解决方案3】:

    一行代码:len(df) - df[1].isna().sum()

    【讨论】:

    • 哦,如果 nan 本身是数据集的一部分呢?喜欢something,,,something?
    • 我不确定df = pd.read_csv('file.csv', header=None) 在他的示例中会在哪个实例中给出nan
    • 这里假设只有两列...?
    【解决方案4】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2017-01-22
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多