繁体   English   中英

pandas dataframe:按索引交换列标题

[英]pandas dataframe: swap column headings by index

我使用 pandas dataframe 到 plot Z628CB5675FF524F3E719B7AA2AE88FE3 用光谱仪采集的数据。

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

output 表总是由对组成

样品 1 未命名:1 样品 2 未命名:2 ...
波长 传输 1 波长 传输 2 ...

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

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

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

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

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

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

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

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

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

# 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']
})
样品1 未命名:1 样品2 未命名:2 样品3 未命名:3
0 23.1 α 12.1 α 0.1 α
1 12.2 测试版 13.4 测试版 0.43 测试版
2 15.8 伽玛 11.1 伽玛 0.29 伽玛
# 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)

Output:

波长 传播 样本
0 23.1 α 1
1 12.2 测试版 1
2 15.8 伽玛 1
3 12.1 α 2
4 13.4 测试版 2
5 11.1 伽玛 2
6 0.1 α 3
7 0.43 测试版 3
8 0.29 伽玛 3

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

您可以最轻松地操纵这些值,而不是整个 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 样品 1 未命名:1 样品 2 未命名:2
1 0.614 传输 1 0.68168 传输 2

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

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

new_df 现在是:

波长
样品 1 0.614
样品 2 0.68168

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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