我有一个名为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
的作用。
我认为merge
或join
可能符合我的要求,但无法理解the docs。
可能pandas.DataFrame
并非设计用于此类数据,我应该使用numpy.genfromtxt
而只是选择我需要的列:我没有看到使用{的任何优势{1}}如果我即时选择列(因为在这种情况下我没有使用索引)。
感谢您的帮助。
答案 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解决了问题:
pd.read_csv()
df = pd.concat(frame_list, keys=test_names)
我没有写这么长的描述,而是在主题上写了a Jupyter notebook,比较了MultiIndex方法,只保留了DataFrames的标准Python列表。