【发布时间】:2016-08-12 06:58:38
【问题描述】:
我找到了一个很棒的方法来parse html 和pandas。我的数据是一种奇怪的格式(附在下面)。我想将此数据拆分为 2 个单独的 dataframes。
注意每个cell 是如何被, 分隔的... 有没有真正有效的方法来拆分所有这些单元格并创建2 个数据帧,一个用于标签,一个用于( value )在括号中?
NumPy 拥有所有这些ufuncs,有没有办法可以在string dtypes 上使用它们,因为它们可以使用DF.as_matrix() 转换为np.array?我试图避开for loops,我可以遍历所有索引并填充一个空数组,但这很野蛮。
我正在使用Beaker Notebook btw,真的很酷(强烈推荐)
#Set URL Destination
url = "http://www.reef.org/print/db/stats"
#Process raw table
DF_raw = pd.pandas.read_html(url)[0]
#Get start/end indices of table
start_label = "10 Most Frequent Species"; start_idx = (DF_raw.iloc[:,0] == start_label).argmax()
end_label = "Top 10 Sites for Species Richness"; end_idx = (DF_raw.iloc[:,0] == end_label).argmax()
#Process table
DF_freqSpecies = pd.DataFrame(
DF_raw.as_matrix()[(start_idx + 1):end_idx,:],
columns = DF_raw.iloc[0,:]
)
DF_freqSpecies
#Split these into 2 separate DataFrames
这是我的幼稚做法:
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
我想要这 2 个数据帧作为我的输出:
【问题讨论】:
-
您可以发布所需的输出 DF 吗?目前还不清楚你想要实现什么
-
是的,让我通过迭代快速计算它们。
-
它现在在上面@MaxU
标签: python arrays string numpy pandas