2016-01-02 25 views
1

我有一个数据帧称为raw_df如何连接pandas.DataFrames列

columns = ['force0', 'distance0', 'force1', 'distance1'] 

raw_data = [{'force0': 1.2, 'distance0': 0.0, 'force1': 0.5, 'distance1': 0.0}, 
      {'force0': 1.3, 'distance0': 0.1, 'force1': 0.6, 'distance1': 0.0}, 
      {'force0': 1.4, 'distance0': 0.2, 'force1': 0.7, 'distance1': 0.3}, 
      {'force0': 1.5, 'distance0': 0.5, 'force1': 0.8, 'distance1': 0.6}] 

raw_df = pd.DataFrame(raw_data, columns=columns) 

raw_df看起来是这样的:

force0 distance0 force1 distance1 
0  1.2  0.0  0.5  0.0 
1  1.3  0.1  0.6  0.0 
2  1.4  0.2  0.7  0.3 
3  1.5  0.5  0.8  0.6 

目前没有指标,但我想的距离列合并为一个索引,所以列是:

  force0 force1 
distance     
0.0   1.2  0.5 
0.0   NaN. 0.6 
0.1   1.3  NaN 
0.2   1.4  NaN 
0.3   NaN  0.7 
0.5   1.5  NaN 
0.6   NaN  0.8 

请注意,distance1 = 0.0时force1中有2个条目。

索引(距离)不应该排序:它们增加然后可变地减少,并且每个测试的原始顺序是重要的。

Stefan对我描述不清的问题发表了一个惊人的答案,但它似乎用其他数字填补了任何失踪的力量(这会误导人,因为这些测试中没有对这些距离进行力测量)。我使用np.nan作为缺失值,因为我认为这是pandas所做的。

我认为mergejoin可能会做我所需要的但不能理解的the docs

也许pandas.DataFrame不是为这样的数据,我应该使用numpy.genfromtxt代替,只是选择我需要在飞行中的列:我看不出有任何优势,使用上飞一个pandas.DataFrame,如果我选择列(因为在这种情况下我没有使用索引)。

感谢您的任何帮助。

+2

如果要处理原始数据帧的示例,会不错。 –

+0

你的'test_ids'是什么? “距离1”,“距离2”等所有值都是唯一的吗? –

+0

test_ids只是与测试编号对应的整数列表。例如,第一个是1,如在力1中 – blokeley

回答

0

我解决了使用MultiIndex DataFrame问题:使用pd.read_csv()

  • 结合DataFrames

    1. 阅读每个测试到一个单独的数据帧到一个使用df = pd.concat(frame_list, keys=test_names)

    而不是写在这里长描述,我写了a Jupyter notebook这个主题,比较了MultiIndex方法和保持DataFrame的标准Python列表。

  • 1

    如果我理解正确的话,你是从一个类似的情况开始:

    columns = list(sum(list(zip(['Forces{}'.format(i) for i in range(4)], ['Distances{}'.format(i) for i in range(4)])),())) 
    df = pd.DataFrame(np.random.randint(1, 11, size=(100, 8)), columns=columns) 
    
        Forces0 Distances0 Forces1 Distances1 Forces2 Distances2 Forces3 \ 
    0  3   5  8   3  7   4  2 
    1  1   4  10   9  9   3  6 
    2  10   3  1   3  3   7  8 
    3  2   1  3   6  10   10  10 
    4  4   2  9   1  3   10  8 
    
        Distances3 
    0   8 
    1   5 
    2   3 
    3   8 
    4   8 
    

    和你的目标是有各种Distance列形成一个index而相应Forcecolumns remain in place. You could stack`的帧像这样:

    df.set_index([c for c in df.columns if c.startswith('Force')], inplace=True) 
    df = df.stack().reset_index(level=-1, drop=True).reset_index().rename(columns={0: 'Distance'}) 
    df.set_index(['Distance'], inplace=True) 
    

    获得:

      Forces0 Forces1 Forces2 Forces3 
    Distance          
    9    7  4  6  7 
    9    7  4  6  7 
    1    7  4  6  7 
    6    7  4  6  7 
    5    1  2  3  1 
    
    +0

    哇。这看起来非常好。我不需要MultiIndex,但看起来不错。我今晚晚些时候我的孩子们在床上时会进行测试。谢谢 – blokeley

    +0

    有没有创建MultiIndex的捷径? – blokeley

    +1

    已更新,所以没有'MultiIndex'。 '.stack()'自动创建额外的'列',所以我就放弃了它。 – Stefan