【问题标题】:All of columnar values of Pandas dataframe in first column, how to extract to correct columns第一列中 Pandas 数据框的所有列值,如何提取以纠正列
【发布时间】:2021-03-19 04:52:58
【问题描述】:

我正在处理一个包含几列的凌乱 csv。有些行在第一列中包含所有列值,如下所示:


    City Edition Sport Discipline Athlete   NOC Gender  Event Event_gender  Medal
330 Paris,1900,Cricket,Cricket,"ROQUES, F.",FRA,Men,cricket,M,Silver    NaN NaN NaN NaN NaN NaN NaN NaN NaN
331 Paris,1900,Cricket,Cricket,"SCHNEIDAU, A.J.",FRA,Men,cricket,M,Silver   NaN NaN NaN NaN NaN NaN NaN NaN NaN
332 Paris,1900,Cricket,Cricket,"TERRY, Henry John",FRA,Men,cricket,M,Silver NaN NaN NaN NaN NaN NaN NaN NaN NaN
333 Paris,1900,Cricket,Cricket,"TOMALIN, P.H.",FRA,Men,cricket,M,Silver NaN NaN NaN NaN NaN NaN NaN NaN NaN
334 Paris   1900.0  Croquet Croquet AUMOITTE    FRA Men double  M   Gold

前四行包含City 列下的所有值,而最后一行包含各个列中的正确值。有几十万行,几乎所有行都有列问题。我必须保持所有行的正确值。

编辑

我的 csv_read 很好,文件本身就是问题所在。引起问题的行在引号内,运动员姓名在引号内,用撇号分隔姓氏和名字。所以我想最好的办法是创建一个函数来打开将去除多余字符的文件。虽然这可能很难在不使用大量内存的情况下实现,因为有 300k 行......

【问题讨论】:

  • 您的分隔符或文件搞砸了。您需要显示文件内容和pd.read_csv 语句
  • @piRSquared 我已经编辑了我的帖子。 csv 内容是问题,所以我需要编辑它们以使数据框正确
  • @Wiseface 您可以使用我建议的解决方案创建数据框..

标签: python pandas nan


【解决方案1】:

您的数据需要一个复杂的正则表达式模式来处理,如下所示:

# conda install -c conda-forge regex
import regex as re
from io import StringIO
import pandas as pd
if __name__ == '__main__':
    input_path = "data/mixed_csv.csv"
    # python re does not support for a variable-width lookbehind 
    pat = re.compile(r'\s+(?=(?:"[^"]*?(?: [^"]*)*))|\s+(?=[^",]+(?:,|$))|,(?=(?:"[^"]*?(?: [^"]*)*))|,(?=[^",]+(?:,|$))')
    refined_lines = ""
    with open(input_path, "r") as fin:
        for line in fin:
            tokens = pat.split(line)
            refined_lines += ",".join(tokens)
    df = pd.read_csv(StringIO(refined_lines), sep=",", index_col=0)
    print(df)

基本上,您需要了解前瞻、后瞻正则表达式模式。

  1. regex1(?=(regex2)) : Positive Lookahead : 匹配 regex1,然后匹配 regex2
  2. regex1(?!(regex2)) : Negative Lookahead : 匹配 regex1,然后 regex2 不匹配
  3. (?<=(regex2))regex1 : Positive Lookbehind : 匹配 regex2, 然后 regex1 匹配
  4. (?<!(regex2))regex1 : Negative Lookbehind : regex2 不匹配,则 regex1 匹配

结果:

      City  Edition    Sport Discipline            Athlete  NOC Gender    Event Event_gender   Medal   0   1   2   3   4   5   6   7   8   9
id                                                                                                                                          
330  Paris   1900.0  Cricket    Cricket         ROQUES, F.  FRA    Men  cricket            M  Silver NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
331  Paris   1900.0  Cricket    Cricket    SCHNEIDAU, A.J.  FRA    Men  cricket            M  Silver NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
332  Paris   1900.0  Cricket    Cricket  TERRY, Henry John  FRA    Men  cricket            M  Silver NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
333  Paris   1900.0  Cricket    Cricket      TOMALIN, P.H.  FRA    Men  cricket            M  Silver NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
334  Paris   1900.0  Croquet    Croquet           AUMOITTE  FRA    Men   double            M    Gold NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

注意事项:

  1. 您应该在第一行添加一些列名(idNaNs 的列名)
  2. 如果内存不足,您可以每行处理每个 tokens 对象,而不是创建数据帧。

【讨论】:

  • 尝试在UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 1204: character maps to <undefined>以上实现时出现以下错误
  • @Wiseface 这与您最初的问题无关。您应该选择encoding='iso8859'encoding='utf8'。我不知道哪一个会起作用,因为我不知道您输入数据的编码。我认为您可以通过我的第一个答案来解决您的原始问题。如果是这样,如果您能接受我的回答,我将不胜感激。
【解决方案2】:

尝试使用usecolspadas.read_csv

 pd.read_csv(data, usecols=['City', 'Edition', 'Sport', 'Discipline', 'Athlete','NOC','Gender','Event','Event_gender','Medal'])

【讨论】:

  • 不幸的是,问题是 csv,所以我必须在通过函数加载时清理内容
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2021-04-28
  • 2021-06-30
相关资源
最近更新 更多