[英]Python Pandas partial slicing and sorting on dataframe columns
我有一个来自光谱仪的波长和吸光度的输入文件。 在此文件中,数据被记录并添加为数据框的最后两列。 需要这些列来指定测量特定吸光度(= 数据)的波长。
波长1 | 数据1 | 波长2 | 数据2 | 波长3 | 数据3 | 等等 |
---|---|---|---|---|---|---|
800 | 0.1 | 798 | 0.02 | 798.5 | 0.6 | 等等 |
799 | 0.15 | 797 | 0.03 | 798.0 | 0.2 | 等等 |
798 | 0.133 | 796 | 0.2 | 797.5 | 0.4 | 等等 |
797 | 0.14 | 795 | 0.052 | 797.0 | 0.34 | 等等 |
等等 | 等等 | 等等 | 等等 | 等等 | 等等 | 等等 |
我想要一个数据框,让我的分析更容易一些。 类似的东西:
波长1 | 数据1 | 波长2 | 数据2 | 波长3 | 数据3 | 等等 |
---|---|---|---|---|---|---|
800 | 0.1 | NaN | NaN | 798.5 | 0.6 | 等等 |
799 | 0.15 | NaN | NaN | 798.0 | 0.2 | 等等 |
NaN | NaN | NaN | NaN | 798.5 | 0.6 | 等等 |
798 | 0.133 | 798 | 0.02 | 798.0 | 0.2 | 等等 |
NaN | NaN | NaN | NaN | 797.5 | 0.4 | 等等 |
797 | 0.14 | 797 | 0.03 | 797.0 | 0.34 | 等等 |
等等 | 等等 | 等等 | 等等 | 等等 | 等等 | 等等 |
我知道,凭借我非常基本的 Python 技能集,我可以将每个波长数据对存储为一个元组列表,并进行一些复杂的排序魔术。 但是自从我试图了解更多关于 pandas 模块的信息后,我想知道我是否可以更轻松地解决这个问题。 但是,虽然我发现了pandas shift function ,但我还没有找到一种方法来使其成为有条件的,也没有单独移动和排序每一列。
df = pd.DataFrame({'Wavelength1': [800, 799, 798, 797],
'Data1': [0.1, 0.15, 0.133, 0.14],
'Wavelength2': [798, 797, 796, 796],
'Data2': [0.02, 0.03, 0.2, 0.052],
'Wavelength3': [798.5, 798.0, 797.5, 797.0],
'Data3': [0.6, 0.2, 0.4, 0.34]})
# wide to long
df2 = (
pd.wide_to_long(df.reset_index(), ["Wavelength", "Data"], i="index", j="reading")
.droplevel(0)
.reset_index()
.set_index(["Wavelength", "reading"])
)
Data
Wavelength reading
800.0 1 0.100
799.0 1 0.150
798.0 1 0.133
797.0 1 0.140
798.0 2 0.020
797.0 2 0.030
796.0 2 0.200
2 0.052
798.5 3 0.600
798.0 3 0.200
797.5 3 0.400
797.0 3 0.340
# long back to wide, delating with duplicate "Wavelength"
df2 = df2.set_index(
pd.Series(df2.groupby(level=[0, 1]).cumcount().values, name="subreading"),
append=True,
).unstack("reading")
# flatten the columns..
df2.columns = ["".join(map(str, c)) for c in df2.columns]
Data1 Data2 Data3
Wavelength subreading
796.0 0 NaN 0.200 NaN
1 NaN 0.052 NaN
797.0 0 0.140 0.030 0.34
797.5 0 NaN NaN 0.40
798.0 0 0.133 0.020 0.20
798.5 0 NaN NaN 0.60
799.0 0 0.150 NaN NaN
800.0 0 0.100 NaN NaN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.