当前位置: 首页 > 知识库问答 >
问题:

Python支持对数据帧列进行部分切片和排序

法风畔
2023-03-14

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

我希望有一个数据框架,使我的分析更容易一点。诸如此类:

我知道,凭借我相当基本的python技能,我可能会将每个波长数据对存储为元组列表,并使一些复杂的排序魔法发生。但是自从我试图了解更多关于熊猫模块的信息以来,我一直在想我是否能更轻松地解决这个问题。然而,虽然我发现了熊猫的移位函数,但我还没有找到一种让它成为条件的方法,也没有单独移位和排序每个列。

共有1个答案

高才
2023-03-14
  • 这是经典的宽到长
  • 您的样本数据在第二组数据中有两个波长796的读数。这实际上意味着重复,通过将子读放在适当的位置来处理
  • 最后转换回long,其中值在波长上排列,并提供重复
  • 显然,转换回宽列和扁平列的步骤是可选的,这取决于您想要如何运行您的分析
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
 类似资料:
  • 我有一个dataframe,。 我想选择中不在列表中的所有索引,

  • 我有一个像这样的数据框- 我有一个这样的列表- 现在,我想根据列名列表对数据框进行排序 因此,新的数据框将有列名称-

  • 问题内容: 在阅读Go slice时,我在方法的上下文中遇到了此行为 如果s的后备数组太小而无法容纳所有给定值,则会分配更大的数组。返回的切片将指向新分配的数组。 来源-高朗之旅 为了理解这一点,我编写了以下代码: 尝试去游乐场 输出: 我希望并指向相同的基础数组,因为它们都是相同长度的切片 但是如果我将相同的代码用于另一片切片: 尝试去游乐场 输出: 在这种情况下,与他们再次同长度的片,但他们不

  • 给定任何熊猫数据帧。我想选择列A, B和F: Z 我已经尝试过了但是没有成功。请告诉我怎么做。

  • 假设我有一个包含列,和的数据帧,我想按升序按列排序,按降序按列排序,如何我要这么做吗?

  • 部分排序可以通过std::Partial_sort完成。 部分排序方式 5 7 4 2 8 6 1 9 0 3 在对3个元素进行部分排序之后 0 1 2 7 8 6 5 9 4 3 http://en.cppreference.com/w/cpp/algorithm/partial_sort. 但当某些元素已经排序时,这不是最好的。 还有其他这样的函数可以这样做并利用部分排序数组。