dataframe:按索引交换列标题

2024-10-01 19:31:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用熊猫数据框来绘制csv。用分光计获取的数据

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

输出表始终由对组成

^{tb1}$

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

一个编号列(“未命名:1”、“未命名:2”和…),实际包含相关测量信息

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

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

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

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

但是,我必须输入每个新数据系列的名称,这些数据系列有时包含10个以上的成对列

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


Tags: csv数据sample名称信息标题df绘制
3条回答

我不确定您的确切意思(示例表中的一些模拟数据会很好),但假设现在每一行都是一个单独的数据帧,每两列都是示例,是否需要这样做

# 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']
})
^{tb1}$
# 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)

输出:

^{tb2}$

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

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

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

您可以最容易地操纵这些值,而不是作为一个整体操纵数据帧

假设您的数据是:

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"]])
^{tb1}$

现在,让我们保留所需的值及其列标题

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

现在新的_df是:

^{tb2}$

相关问题 更多 >

    热门问题