Python 数据帧[单元格=(标签,值)],拆分为两个单独的数据帧

Python 数据帧[单元格=(标签,值)],拆分为两个单独的数据帧,python,arrays,string,numpy,pandas,Python,Arrays,String,Numpy,Pandas,我发现了一种很棒的方法,可以使用熊猫解析html。我的数据是一种奇怪的格式(附在下面)。我想将此数据拆分为两个独立的数据帧 请注意每个单元格是如何用,分隔的是否有任何真正有效的方法来分割所有这些单元格并创建两个数据帧,一个用于标签,另一个用于括号中的(值)? NumPy拥有所有这些ufunc,有没有一种方法可以在字符串dtypes上使用它们,因为它们可以通过DF.as_matrix()转换为np.array?我试图避开循环,我可以遍历所有索引并填充一个空数组,但这太野蛮了 我正在使用烧杯笔记本b

我发现了一种很棒的方法,可以使用熊猫
解析
html
。我的数据是一种奇怪的格式(附在下面)。我想将此数据拆分为两个独立的
数据帧

请注意每个
单元格是如何用
分隔的是否有任何真正有效的方法来分割所有这些单元格并创建两个数据帧,一个用于标签,另一个用于括号中的
(值)

NumPy
拥有所有这些
ufunc
,有没有一种方法可以在
字符串
dtypes
上使用它们,因为它们可以通过
DF.as_matrix()转换为
np.array
?我试图避开循环
,我可以遍历所有索引并填充一个空数组,但这太野蛮了

我正在使用烧杯笔记本
btw,它真的很酷(强烈推荐)

以下是我天真的做法:

import re
DF_species = pd.DataFrame(np.zeros_like(DF_freqSpecies),columns=DF_freqSpecies.columns)
DF_freq = pd.DataFrame(np.zeros_like(DF_freqSpecies).astype(str),columns=DF_freqSpecies.columns)

dims = DF_freqSpecies.shape
for i in range(dims[0]):
    for j in range(dims[1]):
        #Parse current dataframe
        species, freq = re.split("\s\(\d",DF_freqSpecies.iloc[i,j])
        freq = float(freq[:-1])
        #Populate split DataFrames
        DF_species.iloc[i,j] = species
        DF_freq.iloc[i,j] = freq
我希望这两个数据帧作为我的输出:

(1) 种类; 和(2)频率
您可以这样做:

DF1:

和DF2

In [193]: df2 = DF_freqSpecies.replace(r'.*\((\d+\.*\d*)\).*', r'\1', regex=True)

In [194]: df2.head()
Out[194]:
0 Tropical Western Atlantic California, Pacific Northwest and Alaska Hawaii  \
0                        85                                     54.6     92
1                      84.8                                     53.2   85.8
2                        81                                     50.8   85.7
3                      79.9                                     50.2   85.7
4                      74.8                                     49.7   82.9

0 Tropical Eastern Pacific South Pacific Northeast US and Eastern Canada  \
0                     85.7            79                            67.4
1                     82.5          77.3                            46.6
2                     75.2          73.9                            26.2
3                     68.9          73.3                            25.2
4                     67.9          72.8                            23.7

0 South Atlantic States Central Indo-Pacific
0                  79.7                 80.1
1                  78.5                 75.6
2                  78.5                 73.5
3                  72.7                 71.4
4                  65.7                 70.2

我们基本上要删除所有内容,除了括号中的数字:

(\d+\.*\d*)
-组(1)-这是我们的号码

\((\d+\.*\d*)\)
-括号中的数字

*\((\d+\..\d*)\)。
-整件事-在“(”、“(”、我们的号码“)”之前的任何事情,直到单元格结束的任何事情


它将被第(1)组所取代-我们的编号

你能发布所需的输出DFs吗?目前还不清楚你想要实现什么A,让我通过迭代来快速计算它们。现在在上面@MaxU2行!太棒了。你能解释一下
r.*\(\d+\.\d*)\)中发生了什么吗*',r'\1'
我理解另一个,但这一个令人困惑。@O.rka,我已经为正则表达式添加了解释part@MaxU@O.rka小心,第一个替换会吃掉括号中的所有内容,例如
DF_freqSpecies.loc[9,'Hawaii']
@MaxU和另一个小东西:-)在第一次替换中,您可以在正则表达式中添加一个空格:
r'\(\d+\.*\d*\)
。它在输出中处于尾随状态。
In [182]: df1 = DF_freqSpecies.replace(r'\s*\(\d+\.*\d*\)', '', regex=True)

In [183]: df1.head()
Out[183]:
0 Tropical Western Atlantic California, Pacific Northwest and Alaska  \
0                  Bluehead                          Copper Rockfish
1                 Blue Tang                                  Lingcod
2      Stoplight Parrotfish                        Painted Greenling
3        Bicolor Damselfish                           Sunflower Star
4              French Grunt                          Plumose Anemone

0                      Hawaii Tropical Eastern Pacific  \
0               Saddle Wrasse           King Angelfish
1  Hawaiian Whitespotted Toby          Mexican Hogfish
2       Raccoon Butterflyfish               Barberfish
3            Manybar Goatfish            Flag Cabrilla
4                Moorish Idol   Panamic Sergeant Major

0              South Pacific Northeast US and Eastern Canada  \
0            Regal Angelfish                          Cunner
1  Bluestreak Cleaner Wrasse                 Winter Flounder
2           Manybar Goatfish                     Rock Gunnel
3             Brushtail Tang                         Pollock
4       Two-spined Angelfish                  Grubby Sculpin

0 South Atlantic States       Central Indo-Pacific
0         Slippery Dick               Moorish Idol
1       Belted Sandfish       Three-spot Dascyllus
2        Black Sea Bass  Bluestreak Cleaner Wrasse
3               Tomtate     Blacklip Butterflyfish
4                Cubbyu        Clark's Anemonefish
In [193]: df2 = DF_freqSpecies.replace(r'.*\((\d+\.*\d*)\).*', r'\1', regex=True)

In [194]: df2.head()
Out[194]:
0 Tropical Western Atlantic California, Pacific Northwest and Alaska Hawaii  \
0                        85                                     54.6     92
1                      84.8                                     53.2   85.8
2                        81                                     50.8   85.7
3                      79.9                                     50.2   85.7
4                      74.8                                     49.7   82.9

0 Tropical Eastern Pacific South Pacific Northeast US and Eastern Canada  \
0                     85.7            79                            67.4
1                     82.5          77.3                            46.6
2                     75.2          73.9                            26.2
3                     68.9          73.3                            25.2
4                     67.9          72.8                            23.7

0 South Atlantic States Central Indo-Pacific
0                  79.7                 80.1
1                  78.5                 75.6
2                  78.5                 73.5
3                  72.7                 71.4
4                  65.7                 70.2