我有以下DataFrame:
Col1 Col2 Col3 Type
0 1 2 3 1
1 4 5 6 1
...
20 7 8 9 2
21 10 11 12 2
...
45 13 14 15 3
46 16 17 18 3
...
Run Code Online (Sandbox Code Playgroud)
从csv文件中读取DataFrame.所有具有Type1的行都在顶部,其次是具有Type2 的行,然后是具有Type3 的行等.
我想改组DataFrame的行,以便所有的行Type都是混合的.可能的结果可能是:
Col1 Col2 Col3 Type
0 7 8 9 2
1 13 14 15 3
...
20 1 2 3 1
21 10 11 12 2
...
45 4 5 6 …Run Code Online (Sandbox Code Playgroud) 您知道如何将DataFrame的索引或列作为NumPy数组或python列表获取吗?
这是Subsetting Dask DataFrames的后续问题.我希望在将数据批量发送到ML算法之前对来自dask数据帧的数据进行混洗.
该问题的答案是做以下事情:
for part in df.repartition(npartitions=100).to_delayed():
batch = part.compute()
Run Code Online (Sandbox Code Playgroud)
然而,即使我要改变批次的内容,我也有点担心它可能不太理想.数据是一个时间序列集,因此数据点在每个分区内高度相关.
理想情况下我喜欢的是:
rand_idx = np.random.choice(len(df), batch_size, replace=False)
batch = df.iloc[rand_idx, :]
Run Code Online (Sandbox Code Playgroud)
哪个适用于熊猫,但不适用于dask.有什么想法吗?
我试过了
train_len = int(len_df*0.8)
idx = np.random.permutation(len_df)
train_idx = idx[:train_len]
test_idx = idx[train_len:]
train_df = df.loc[train_idx]
test_df = df.loc[test_idx]
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试这样做,则train_df.loc[:5,:].compute()返回一个124451行数据帧.所以显然使用dask错了.
我正在开发一个对产品进行用户评论的项目.我使用TfidfVectorizer从我的数据集中提取功能,除了我手动提取的一些其他功能.
df = pd.read_csv('reviews.csv', header=0)
FEATURES = ['feature1', 'feature2']
reviews = df['review']
reviews = reviews.values.flatten()
vectorizer = TfidfVectorizer(min_df=1, decode_error='ignore', ngram_range=(1, 3), stop_words='english', max_features=45)
X = vectorizer.fit_transform(reviews)
idf = vectorizer.idf_
features = vectorizer.get_feature_names()
FEATURES += features
inverse = vectorizer.inverse_transform(X)
for i, row in df.iterrows():
for f in features:
df.set_value(i, f, False)
for inv in inverse[i]:
df.set_value(i, inv, True)
train_df, test_df = train_test_split(df, test_size = 0.2, random_state=700)
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.但当我将max_features45从更改为更高时,我会tran_test_split在线上出错.
错误是:
Traceback (most recent call last):
File "analysis.py", line 120, …
以下经过极端简化的DataFrame表示包含医疗诊断的更大的DataFrame:
medicalData = pd.DataFrame({'diagnosis':['positive','positive','negative','negative','positive','negative','negative','negative','negative','negative']})
medicalData
diagnosis
0 positive
1 positive
2 negative
3 negative
4 positive
5 negative
6 negative
7 negative
8 negative
9 negative
Run Code Online (Sandbox Code Playgroud)
对于机器学习,我需要通过以下方式将该数据帧随机分为三个子帧:
trainingDF, validationDF, testDF = SplitData(medicalData,fractions = [0.6,0.2,0.2])
Run Code Online (Sandbox Code Playgroud)
在拆分数组指定进入每个子帧的完整数据的一部分的情况下,子帧中的数据需要互斥,拆分数组的总和必须为1。 另外,每个子集中阳性诊断的比例必须大致相同。
对于这个问题的答案建议使用pandas示例方法或sklearn的train_test_split函数。但是这些解决方案似乎都不能很好地推广到n个拆分,也没有一个提供分层拆分。
如何将数据帧拆分为多个数据帧,其中每个数据帧包含相等但随机的数据?它不是基于特定列.
例如,我在数据帧中有一个100行和30列.我想将这些数据分成5个批次.我应该在每个数据框中有20个记录,每个数据框有相同的30列,并且所有5个批次都没有重复,我选择行的方式应该是随机的.我不希望在单个列上随机选择.
我认为我将使用index和numpy并将它们分成多个并使用它来分割数据帧的一种方法.想要看看有人有一个简单的熊猫方式.
pandas ×5
python ×4
dataframe ×2
dask ×1
permutation ×1
python-2.7 ×1
scikit-learn ×1
shuffle ×1