как иметь дело с вставленной копией таблицей в pandas - изменяя вектор столбца - PullRequest
0 голосов
/ 08 июля 2019

У меня есть таблица, которую я скопировал с веб-страницы , которая при вставке в librecalc или excel занимает одну ячейку, а при вставке в блокнот становится столбцом 3507x1.Если я импортирую это как фрейм данных pandas, используя pd.read_csv, я вижу тот же столбец 3507x1, и теперь я хотел бы преобразовать его в массив 501x7, который начинался как.

Я думал, что смогу преобразовать егоnumpy array, измените форму, как я знаю в numpy, и затем поместите обратно в df, но методы панд to_numpy, похоже, хотят работать с объектом Series (не Dataframe) и пытаются прочитать файл в Series, используя, например,

ser= pd.Series.from_csv('billionaires')        

привело к ошибкам токенизации.Есть ли какой-нибудь простой способ сделать это?Может быть, я должен бросить полотенце в этом направлении и прочитать из HTML?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Простая вставка копий не дает четкого разделителя столбцов, поэтому это невозможно сделать легко.
У вас есть только пробелы, но пробелы могут быть или не быть внутри значений столбца (как в имени илистрана), поэтому невозможно присвоить 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 'устарела.

0 голосов
/ 08 июля 2019

Я обнаружил, что преобразование в массив 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...