我正在使用iris.scale数据集进行分析。但是在处理过程中如何在读取数据文件后得到切片列值
df = pd.read_csv("../Data/iris.scale.csv", sep=' ', header=None, names=['class','S.lenght','S.width','P.lenght','P.width'])
print(df.head(3))
class S.lenght S.width P.lenght P.width
1 1:-0.555556 2:0.25 3:-0.864407 4:-0.916667
1 1:-0.666667 2:-0.166667 3:-0.864407 4:-0.916667
1 1:-0.833333 2:-0.08333 3:-0.830508 4:-0.916667
但是如何获得这些切片列,就像没有任何特征引用的那样,所以可以处理
class S.lenght S.width P.lenght P.width
1 -0.555556 0.25 -0.864407 -0.916667
1 -0.666667 -0.166667 -0.864407 -0.916667
1 -0.833333 -0.08333 -0.830508 -0.916667
答案 0 :(得分:1)
您可以使用set_index
创建DataFrame
,其中:
的值仅由split
提取,最后一次输出为float
:
df=df.set_index('class').apply(lambda x: x.str.split(':').str[1]).astype(float).reset_index()
print (df)
class S.lenght S.width P.lenght P.width
0 1 -0.555556 0.250000 -0.864407 -0.916667
1 1 -0.666667 -0.166667 -0.864407 -0.916667
2 1 -0.833333 -0.083330 -0.830508 -0.916667
str.extract
的另一个解决方案:
df = df.set_index('class').apply(lambda x: x.str.extract(':(.*)', expand=False)).astype(float).reset_index()
print (df)
class S.lenght S.width P.lenght P.width
0 1 -0.555556 0.250000 -0.864407 -0.916667
1 1 -0.666667 -0.166667 -0.864407 -0.916667
2 1 -0.833333 -0.083330 -0.830508 -0.916667
答案 1 :(得分:1)
pandas
filter
专注于正确的列stack
+ str.split
+ unstack
update
代码
df.update(
df.filter(regex='S|P').stack().str.split(':').str[1].astype(float).unstack())
df
class S.lenght S.width P.lenght P.width
0 1 -0.555556 0.25 -0.864407 -0.916667
1 1 -0.666667 -0.166667 -0.864407 -0.916667
2 1 -0.833333 -0.08333 -0.830508 -0.916667
numpy
split
整个数组代码
s = np.core.defchararray.split(df.values[:, 1:].astype(str), ':').tolist()
df.iloc[:, 1:] = np.array(s)[:, :, 1].astype(float)
class S.lenght S.width P.lenght P.width
0 1 -0.555556 0.25 -0.864407 -0.916667
1 1 -0.666667 -0.166667 -0.864407 -0.916667
2 1 -0.833333 -0.08333 -0.830508 -0.916667
答案 2 :(得分:0)
在将数据输送到Pandas之前预先处理数据以去除多余的数据
import re, io
with open("../Data/iris.scale.csv") as f:
data = f.read()
p = r'[1-4]:'
data = re.sub(p, '', data)
然后,您可以将数据写入新文件,然后将其提供给Pandas,或者将其放入类似文件的对象中,然后将其提供给Pandas。
#Python 2.7
data = io.BytesIO(data)
#Python 3x
#data = io.StringIO(data)
df = pd.read_csv(data, delim_whitespace = True, index_col = False, names=['class','S.lenght','S.width','P.lenght','P.width'])