我使用 pandas 数据框绘制 csv。用光谱仪采集的数据。
df = pd.read_csv("C:\\file.csv") # import file
输出表总是由成对组成
样本 1 | 未命名:1 | 示例 2 | 未命名:2 | ... |
---|---|---|---|---|
波长 | 传输 1 | 波长 | 传输 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 个配对列的每个新数据系列输入名称。
有没有办法通过索引交换标题? 或者你能想到一个更优雅的版本吗?这种表格数据输出的形式,其中标题总是跨越两列,当然不是孤立的情况。 非常感谢
答案 0 :(得分:0)
我不确定您的确切意思(示例表中的一些模拟数据会很棒),但假设现在每一行都是一个单独的数据框并且每两列都是示例,这样的事情会起作用吗?< /p>
# 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 | 未命名:1 | sample2 | 未命名:2 | sample3 | 未命名:3 | |
---|---|---|---|---|---|---|
0 | 23.1 | alpha | 12.1 | alpha | 0.1 | alpha |
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)
输出:
波长 | 传输 | 示例 | |
---|---|---|---|
0 | 23.1 | alpha | 1 |
1 | 12.2 | 测试版 | 1 |
2 | 15.8 | 伽玛 | 1 |
3 | 12.1 | alpha | 2 |
4 | 13.4 | 测试版 | 2 |
5 | 11.1 | 伽玛 | 2 |
6 | 0.1 | alpha | 3 |
7 | 0.43 | 测试版 | 3 |
8 | 0.29 | 伽玛 | 3 |
所有的数据关系都还保留着,你只需做一个new_df.groupby('wavelength').mean()
就可以找到每个波长的平均值。用 apply()
替换 mean 并根据需要添加您自己的函数。
答案 1 :(得分:0)
您可以最轻松地操作这些值,而不是整个 DataFrame。
假设您的数据是:
function getMyLikedVideos(maxNmbrToGet,dataToGet) {
var results;
maxNmbrToGet = maxNmbrToGet ? maxNmbrToGet : 10;
dataToGet = dataToGet ? dataToGet : "id";
//YouTube.Videos.list.list()
results = YouTube.Videos.list(dataToGet, {myRating: 'like', maxResults: maxNmbrToGet});
//Logger.log('results: ' + results);
Logger.log('results.items[0].id: ' + results.items[0].id);
return results.items;
}
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 示例 1 | 未命名:1 | 示例 2 | 未命名:2 |
1 | 0.614 | 传输 1 | 0.68168 | 传输 2 |
现在让我们保留我们想要的值及其列标题。
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"]])
new_df 现在是:
波长 | |
---|---|
示例 1 | 0.614 |
示例 2 | 0.68168 |
答案 2 :(得分:0)
您可以将列标签分为两部分:偶数列和奇数列。然后,在每对奇偶编号列中交换它们的序列,如下所示:
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