【问题标题】:Python Pandas partial slicing and sorting on dataframe columnsPython Pandas 对数据框列进行部分切片和排序
【发布时间】:2021-09-12 01:52:09
【问题描述】:

我有一个光谱仪的波长和吸光度输入文件。在此文件中,数据被记录并添加为数据框的最后两列。需要这些列来指定测量特定吸光度(=数据)的波长。

Wavelength1 Data1 Wavelength2 Data2 Wavelength3 Data3 and so on
800 0.1 798 0.02 798.5 0.6 and so on
799 0.15 797 0.03 798.0 0.2 and so on
798 0.133 796 0.2 797.5 0.4 and so on
797 0.14 795 0.052 797.0 0.34 and so on
and so on and so on and so on and so on and so on and so on and so on

我想要一个数据框,让我的分析更容易一些。类似的东西:

Wavelength1 Data1 Wavelength2 Data2 Wavelength3 Data3 and so on
800 0.1 NaN NaN 798.5 0.6 and so on
799 0.15 NaN NaN 798.0 0.2 and so on
NaN NaN NaN NaN 798.5 0.6 and so on
798 0.133 798 0.02 798.0 0.2 and so on
NaN NaN NaN NaN 797.5 0.4 and so on
797 0.14 797 0.03 797.0 0.34 and so on
and so on and so on and so on and so on and so on and so on and so on

我知道,凭借我非常基本的 Python 技能集,我可能可以将每个波长数据对存储为一个元组列表,并让一些复杂的排序魔法发生。但是自从尝试更多地了解 pandas 模块后,我想知道我是否可以更轻松地解决这个问题。然而,虽然我找到了pandas shift function,但我还没有找到一种方法来使它有条件,也没有单独移动和排序每一列。

【问题讨论】:

  • 我能问一下为什么你有多个 Wavelength 列吗? DataFrame 是否需要多于两列(波长、数据)?
  • “Wavelength2”中有两个 796 条目。你会保留哪个?
  • @philosofool:您可能希望更改波长之间的点数以便更好地估计某个峰值,但通常一个波长列和多个数据列应该是好的。
  • @not_speshal:这是一个错误。我修好了。

标签: python pandas dataframe slice data-manipulation


【解决方案1】:
  • 这是经典wide to long
  • 您的样本数据在第二组数据中有两个波长 796 的读数。这实际上意味着重复,通过放置 subreading 来解决这个问题
  • 最终转换回 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2020-02-29
    • 2020-12-26
    • 2021-03-27
    • 2013-07-14
    • 2018-04-11
    相关资源
    最近更新 更多