繁体   English   中英

Python Pandas 对数据框列进行部分切片和排序

[英]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 ,但我还没有找到一种方法来使其成为有条件的,也没有单独移动和排序每一列。

  • 这是经典的宽到长
  • 您的样本数据在第二组数据中有两个波长 796 的读数。 这实际上意味着重复,通过放置子阅读来解决这个问题
  • 最后转换回 long,其中值在Wavelength上排列并提供重复项
  • 显然,根据您希望如何运行分析,转换回宽列和展平列的步骤是可选的
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM