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