如何处理熊猫中复制粘贴的表格-重塑列向量

时间:2019-07-07 22:44:24

标签: python pandas numpy

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

2 个答案:

答案 0 :(得分:2)

简单的复制粘贴不会为您提供任何清晰的列分隔符,因此不可能轻松实现。
您只有空格,但是空格也可能会或可能不会在列值内(例如名称或国家/地区),因此无法为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

由于不推荐使用Series.from_csv,因此我使用DataFrame.read_csv来读取文件。

答案 1 :(得分:0)

我发现转换为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