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