代码之家  ›  专栏  ›  技术社区  ›  Karl

基于切片的数据帧更新

  •  0
  • Karl  · 技术社区  · 7 年前

    sklearn.model_selection.train_test_split

    我目前的做法如下:

    import pandas as pd
    import numpy as np
    from sklearn import model_selection
    
    dates = pd.date_range('20130101',periods=10)
    df = pd.DataFrame(np.random.randn(10,4),index=dates,columns=list('ABCD')).reset_index()
    
    split = [0.8, 0.2]
    split_seed = 123
    
    train_df, test_df = model_selection.train_test_split(df, train_size = split[0], test_size = split[1], random_state=split_seed)
    
    train_df["Dataset"] = "train"
    test_df["Dataset"] = "test"
    
    final_df = train_df.append(test_df)
    

    df 对象:

    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead
    

    这其实并不重要,因为在这之后就不再使用原始的数据帧了。但我很好奇我怎么能做得不一样。我想不是编辑 train_df test_df 再加上它们,我就可以编辑了 直接,但作为我不太熟悉如何 .loc .iloc

    说明我要查找的内容的Psuedo代码如下:

    df["Dataset"] = "train" WHERE index in train_df.index.values
    df["Dataset"] = "test" WHERE index in test_df.index.values
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   user3471881    7 年前

    如果你不想 copy DataFrame model_selection.train_test_split() loc :

    df.loc[train_df.index, 'Dataset'] = 'train'
    df.loc[test_df.index, 'Dataset'] = 'test'
    
        2
  •  2
  •   jpp    7 年前

    一种方法是使用 np.where 要在布尔条件上添加条件序列,请执行以下操作:

    df['Dataset'] = np.where(df.index.isin(train_df.index.values), 'train', 'test')
    

    当然,这是假设索引不包含在 train_df 必须 test_df

    或使用 np.select 要获得适应性更强的解决方案:

    conds = [df.index.isin(train_df.index.values),
             df.index.isin(test.index.values)]
    
    df['Dataset'] = np.select(conds, ['train', 'test'], 'other')