【问题标题】:pandas dataframe: swap column headings by index熊猫数据框:按索引交换列标题
【发布时间】:2021-08-23 20:03:25
【问题描述】:

我使用 pandas 数据框来绘制 csv。用光谱仪采集的数据。

df = pd.read_csv("C:\\file.csv") # import file

输出表总是由对组成的

sample 1 Unnamed:1 sample 2 Unnamed:2 ...
wavelengths transmission 1 wavelengths transmission 2 ...

属于每个样本的一列(“样本 1”、“样本 2”、...),其中有关样本的相关信息存储在标题中,但该列仅包含波长信息

实际上包含相关测量信息的一个编号列('Unnamed: 1'、'Unnamed: 2'、...)

我现在想将数据显示为波长的函数。如果我使用删除所有包含冗余波长信息的列

df = df.drop(data.columns[1,37], axis=1, inplace=False)

我丢失了标题中包含的样本信息 我现在正在考虑交换列标题,然后删除我不需要的列。 我当然可以使用某些东西按名称交换列

df[['sample 1','Unnamed: 1']]=df[['Unnamed: 1','sample 1']]

但是我必须为每个有时包含超过 10 个配对列的新数据系列输入名称。

有没有办法通过索引交换标题? 或者你能想到一个更优雅的版本吗?这种表格数据输出形式,其中标题总是跨越两列,当然不是孤立的情况。 非常感谢

【问题讨论】:

  • 我没有得到你真正想要的东西。如果您需要使用列名进行过滤,请使用:df.filter(like='samp')
  • 你的 DataFrame 有单行吗?
  • 你想要这样的东西吗:stackoverflow.com/questions/66581283/…

标签: python pandas dataframe multiple-columns


【解决方案1】:

您可以最轻松地操作这些值,而不是整个 DataFrame。

假设您的数据是:

import pandas as pd
# Example data
df = pd.DataFrame([["sample 1", "Unnamed:1", "sample 2", "Unnamed:2"], [0.614, "transmission 1", 0.68168, "transmission 2"]])
0 1 2 3
0 sample 1 Unnamed:1 sample 2 Unnamed:2
1 0.614 transmission 1 0.68168 transmission 2

现在让我们保留我们想要的值及其列标题。

vals = df.values
new_df = pd.DataFrame(vals[1,::2], index= vals[0, ::2], columns=["wavelength")

new_df 现在是:

wavelength
sample 1 0.614
sample 2 0.68168

【讨论】:

    【解决方案2】:

    我不确定您的确切意思(示例表中的一些模拟数据会很棒),但假设现在每一行都是一个单独的数据框并且每两列是示例,这样的事情会起作用吗?

    # sample data
    df = pd.DataFrame({
        'sample1':[23.1, 12.2, 15.8],
        'Unnamed:1':['alpha','beta','gamma'],
        'sample2':[12.1, 13.4, 11.1],
        'Unnamed:2':['alpha','beta','gamma'],
        'sample3':[0.1,0.43,0.29],
        'Unnamed:3':['alpha','beta','gamma']
    })
    
    sample1 Unnamed:1 sample2 Unnamed:2 sample3 Unnamed:3
    0 23.1 alpha 12.1 alpha 0.1 alpha
    1 12.2 beta 13.4 beta 0.43 beta
    2 15.8 gamma 11.1 gamma 0.29 gamma
    # initiate a blank dataframe
    new_df = pd.DataFrame()
    
    # filter columns by the sample number, then append to new_f
    n = 3 # number of samples
    for i in range(1,n+1):
        temp_df = df[[col for col in df.columns if f'{i}' in col]]
        temp_df.columns = 'wavelength','transmission'
        temp_df['sample'] = i
        new_df = new_df.append(temp_df)
    new_df = new_df.reset_index(drop=True)
    

    输出:

    wavelength transmission sample
    0 23.1 alpha 1
    1 12.2 beta 1
    2 15.8 gamma 1
    3 12.1 alpha 2
    4 13.4 beta 2
    5 11.1 gamma 2
    6 0.1 alpha 3
    7 0.43 beta 3
    8 0.29 gamma 3

    仍然保留所有数据关系,您只需执行new_df.groupby('wavelength').mean() 即可找到每个波长的平均值。用 apply() 替换 mean 并根据需要添加您自己的函数。

    【讨论】:

      【解决方案3】:

      您可以将列标签分为两部分:偶数列和奇数列。然后,在每对偶数列中交换它们的序列,如下所示:

      swapped_cols = np.ravel([[y, x] for x, y in zip(df.columns[0::2], df.columns[1::2])])
      

      这里,df.columns[0::2]df.columns[1::2] 包含偶数和奇数列。

      print(swapped_cols)
      
      ['Unnamed:1' 'sample 1' 'Unnamed:2' 'sample 2']
      

      案例1:如果你只想交换列标签,而不交换列内容,你可以这样做:

      df.columns = swapped_cols
      

      结果

      print(df)
      
           Unnamed:1        sample 1    Unnamed:2        sample 2
      0  wavelengths  transmission 1  wavelengths  transmission 2
      

      案例2:如果你想交换列序列(列标签和列内容交换在一起),你可以这样做:

      df = df[swapped_cols]
      

      结果

      print(df)
      
              Unnamed:1     sample 1       Unnamed:2     sample 2
      0  transmission 1  wavelengths  transmission 2  wavelengths
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-01
        • 2022-07-10
        • 2017-10-02
        • 2013-12-28
        • 1970-01-01
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多