【问题标题】:how to deal with a copy-pasted table in pandas- reshaping a column vector如何处理熊猫中的复制粘贴表-重塑列向量
【发布时间】:2019-11-17 11:33:19
【问题描述】:

我有一张从webpage 复制的表格,当粘贴到 librecalc 或 excel 中时占据一个单元格,粘贴到笔记本中时变成 3507x1 列。如果我使用 pd.read_csv 将其作为 pandas 数据框导入,我会看到相同的 3507x1 列,现在我想将其重塑为它开始时的 501x7 数组。

我以为我可以重铸为一个 numpy 数组,按照我在 numpy 中熟悉的方式重新整形,然后放回 df,但是 pandas 的 to_numpy 方法似乎想要使用 Series 对象(而不是 Dataframe)并尝试使用例如

将文件读入系列
ser= pd.Series.from_csv('billionaires')        

导致标记错误。有一些简单的方法可以做到这一点吗?也许我应该在这个方向上认输并从html中阅读?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    简单的复制粘贴不会为您提供任何清晰的列分隔符,因此无法轻松完成。
    您只有空格,但空格也可能在也可能不在列值内(如名称或国家/地区),因此不可能给 DataFrame.read_csv 列分隔符。

    但是,如果我将表格复制粘贴到文件中,我会注意到规律性。
    如果你知道正则表达式,你可以尝试使用pandas.Series.str.extract。此方法将正则表达式模式中的捕获组提取为 DataFrame 的列。正则表达式应用于系列的每个元素/字符串。

    然后,您可以尝试找到一个正则表达式模式来捕获行的各种元素,以将它们分成单独的列。

    df = pd.read_csv('data.txt', names=["A"]) #no header in the file
    ss = df['A']
    rdf = ss.str.extract('(\d)\s+(.+)(\$[\d\.]+B)\s+([+-]\$[\d\.]+[BM])\s+([+-]\$[\d\.]+B)\s+([\w\s]+)\s+([\w\s]+)')
    

    这里我尝试为链接中的表格编写一个正则表达式,第一个结果似乎还不错。

       0                              1       2        3        4                    5            6
    0  1                    Jeff Bezos    $121B   +$231M  -$3.94B       United States    Technology
    1  3               Bernard Arnault    $104B   +$127M  +$35.7B              France      Consumer
    2  4                Warren Buffett   $84.9B  +$66.3M  +$1.11B       United States   Diversified
    3  5               Mark Zuckerberg   $76.7B   -$301M  +$24.6B       United States    Technology
    4  6                Amancio Ortega   $66.5B   +$303M  +$7.85B               Spain        Retail
    5  7                 Larry Ellison   $62.3B   +$358M  +$13.0B       United States    Technology
    6  8                   Carlos Slim   $57.0B   -$331M  +$2.20B              Mexico   Diversified
    7  9  Francoise Bettencourt Meyers   $56.7B  -$1.12B  +$10.5B              France      Consumer
    8  0                    Larry Page   $55.7B   +$393M  +$4.47B       United States    Technology
    

    我使用DataFrame.read_csv 读取文件,因为不推荐使用 `Series.from_csv'。

    【讨论】:

    • 但它会跳过任何不符合模式的内容,例如比尔盖茨逃脱了正则表达式,允许他发出另一个 windows 版本。我需要所有的行来做进一步的工作
    • 我没有尝试表格的所有行。如果存在具有更复杂模式的行,则应相应地编辑正则表达式。
    • 恕我直言,上面概述的直接方法比尝试正则表达式并在它中断时修补它更容易
    【解决方案2】:

    我发现转换为 numpy 数组比我意识到的要容易得多 - numpy asarray 方法可以处理 df(而且它很方便地适用于一般对象,而不仅仅是数字)

    df = pd.read_csv('billionaires',sep='\n')
    print(df.shape)
       ->  (3507, 1)
    n = np.asarray(df)
    m = np.reshape(n,[-1,7])
    df2=pd.DataFrame(m)
    df2.head()
    
       0                1                2              3             4  \
    0  0             Name  Total net worth  $ Last change  $ YTD change   
    1  1       Jeff Bezos            $121B         +$231M       -$3.94B   
    2  2       Bill Gates            $107B         -$421M       +$16.7B   
    3  3  Bernard Arnault            $104B         +$127M       +$35.7B   
    4  4   Warren Buffett           $84.9B        +$66.3M       +$1.11B   
    
                   5            6  
    0        Country     Industry  
    1  United States   Technology  
    2  United States   Technology  
    3         France     Consumer  
    4  United States  Diversified  
    

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多