Python/Pandas:如何将一列在特定行处分割为多个部分

gijlo24d  于 2023-04-04  发布在  Python
关注(0)|答案(1)|浏览(125)

我的实验室仪器提供了一个数据集,格式如下。
| 语音合成|周期1|
| --------------|--------------|
| 波长(nm)|吸光度|
| 一百|十二岁|
| 两百|二十三|
| 三百|十七岁|
| 四百|十四岁|
| 语音合成|周期2|
| 波长(nm)|吸光度|
| 一百|七十三|
| 两百|二十五|
| 三百|一百七十九|
| 四百|十五岁|
| 语音合成|周期3|
| 波长(nm)|吸光度|
| 一百|六十|
| 两百|四十五|
| 三百|十二岁|
| 四百|一百|
我想将每个周期单独划分为一组独特的列,如下所示,以便于后续分析。
| 波长(循环1)|吸光度(循环1)|波长(循环2)|吸光度(循环2)|波长(循环3)|吸光度(循环3)|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 一百|十二岁|一百|七十三|一百|六十|
| 两百|二十三|两百|二十五|两百|四十五|
| 三百|十七岁|三百|一百七十九|三百|十二岁|
| 四百|十四岁|四百|十五岁|四百|一百|
在www.example.com _csv()函数中似乎没有用于这种分隔形式的分隔符pd.read。我无法找到使用df.iloc[]、df.groupby()或Series.str.split()函数执行此操作的方法。
类似的问题以前已经在这里讨论过:Python Reshape Column Into Multiple Columns - Alternating Rows
在这种情况下,每个循环中的行数并不总是一致的,因此,我不相信整形会起作用。

gpnt7bae

gpnt7bae1#

首先在read_csv中使用header=None参数创建默认0,1列的DataFrame:

df = pd.read_csv(file, header=None)
    
print (df)
                  0           1
0               TTS     Cycle 1
1   Wavelength (nm)  Absorbance
2               100          12
3               200          23
4               300          17
5               400          14
6               TTS     Cycle 2
7   Wavelength (nm)  Absorbance
8               100          73
9               200          25
10              300         179
11              400          15
12              TTS     Cycle 3
13  Wavelength (nm)  Absorbance
14              100          60
15              200          45
16              300          12
17              400         100

然后创建组识别周期,这里是比较第一列TTS和重复第二列值c列和混凝土组gGroupBy.cumcount,所以可能的旋转和创建列表解析中的最终列名称:

m = df[0].eq('TTS')
df1 = (df[~m & df[1].ne('Absorbance')]
       .assign(c=df[1].where(m).ffill().fillna(df.columns[1]),
               g=lambda x: x.groupby('c').cumcount()).pivot(index='g', columns='c')
       .sort_index(level=1, axis=1)
       .rename(columns={0:'Wavelength', 1:'Absorbance'}))

df1.columns = [f'{a} ({b})' for a, b in df1.columns]
print (df1)
  Wavelength (Cycle 1) Absorbance (Cycle 1) Wavelength (Cycle 2)  \
g                                                                  
0                  100                   12                  100   
1                  200                   23                  200   
2                  300                   17                  300   
3                  400                   14                  400   

  Absorbance (Cycle 2) Wavelength (Cycle 3) Absorbance (Cycle 3)  
g                                                                 
0                   73                  100                   60  
1                   25                  200                   45  
2                  179                  300                   12  
3                   15                  400                  100

如果每个周期的波长相同,则可以创建一个色谱柱:

m = df[0].eq('TTS')
df2 = (df[~m & df[1].ne('Absorbance')]
       .assign(c=df[1].where(m).ffill().fillna(df.columns[1]),
               g=lambda x: x.groupby('c').cumcount()).pivot(index=0, columns='c', values=1)
       .rename_axis(index='Wavelength', columns=None)
       .rename(columns= lambda x: f'Absorbance ({x})')
       .reset_index()
       )

print (df2)
  Wavelength Absorbance (Cycle 1) Absorbance (Cycle 2) Absorbance (Cycle 3)
0        100                   12                   73                   60
1        200                   23                   25                   45
2        300                   17                  179                   12
3        400                   14                   15                  100

相关问题