如何连接pandas.DataFrames列

时间:2016-01-02 15:51:00

标签: python numpy pandas

我有一个名为raw_df的DataFrame:

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

请注意,force1中有2个条目,距离为1 = 0.0。

不应对索引(距离)进行排序:它们会逐渐增加然后减少,每次测试的原始顺序都很重要。

斯特凡对我描述得不好的问题发布了一个惊人的答案,但它似乎用其他数字填补了任何缺失的力量(这会产生误导,因为在这些测试中没有对这些距离进行力测量)。我使用np.nan表示缺少值,因为我认为这是pandas的作用。

我认为mergejoin可能符合我的要求,但无法理解the docs

可能pandas.DataFrame并非设计用于此类数据,我应该使用numpy.genfromtxt而只是选择我需要的列:我没有看到使用{的任何优势{1}}如果我即时选择列(因为在这种情况下我没有使用索引)。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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,而相应的Force columns remain in place. You could堆叠框架就像这样:

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

答案 1 :(得分:0)

我使用MultiIndex DataFrame解决了问题:

  1. 使用pd.read_csv()
  2. 将每个测试读入单独的DataFrame
  3. 使用df = pd.concat(frame_list, keys=test_names)
  4. 将DataFrame合并为一个

    我没有写这么长的描述,而是在主题上写了a Jupyter notebook,比较了MultiIndex方法,只保留了DataFrames的标准Python列表。