如何从数据框中提取不同的4行组并解栈列



我是Python的新手,在处理这个问题的方式上迷路了:我有一个数据框架,其中我需要的信息主要分组在2、3和4行的层中。每个组在其中一列中有一个不同的ID。我需要创建另一个数据框,其中的行组现在是单行,其中的信息是在更多列中未堆叠的。之后我可以删除不需要的/冗余的列。

我认为我需要通过数据框行迭代和过滤每个ID行解堆叠到一个新的数据框。我无法从unstackgroupby函数中获得太多信息。是否有一个简单的功能或组合可以完成这项任务?

下面是一个数据框架的示例:

2_SH1_G8_D_total;Positions tolerance d [z] ;"";0.000; ;0.060;"";0.032;0.032;53%
12_SH1_G8_D_total;Positions tolerance d [z] ;"";-58.000;"";"";"";---;"";""
12_SH1_G8_D_total;Positions tolerance d [z] ;"";-1324.500;"";"";"";---;"";""
12_SH1_G8_D_total;Positions tolerance d [z] ;"";391.000;"";"";"";390.990;"";""
13_SH1_G8_D_total;Flatness;"";0.000; ;0.020;"";0.004;0.004;20%
14_SH1_G8_D_total;Parallelism tolerance  ;"";0.000; ;0.030;"";0.025;0.025;84%
15_SH1_B1_B;Positions tolerance d [x y] ;"";0.000; ;0.200;"";0.022;0.022;11%
15_SH1_B1_B;Positions tolerance d [x y] ;"";265.000;"";"";"";264.993;"";""
15_SH1_B1_B;Positions tolerance d [x y] ;"";1502.800;"";"";"";1502.792;"";""
15_SH1_B1_B;Positions tolerance d [x y] ;"";-391.000;"";"";"";---;"";""

原始数据帧有4行信息,但并不总是这样。结束的数据框每个Id应该只有一行,所有的信息都在列中。

到目前为止,在帮助下,我成功地运行了以下代码:
with open(path, newline='') as datafile:
data = csv.reader(datafile, delimiter=';')
for row in data:
tmp.append(row)
# Create data table joining data with the same GAT value, GAT is the ID I need
Data = []
Data.append(tmp[0])
GAT = tmp[0][0]
j = 0
counter = 0
for i in range(0,len(tmp)):
if tmp[i][0] == GAT:
counter = counter + 1
if counter == 2:
temp=(tmp[i][5],tmp[i][7],tmp[i][8],tmp[i][9])


else:
temp = (tmp[i][3], tmp[i][7])
Data[j].extend(temp)

else:
Data.append(tmp[i])
GAT = tmp[i][0]
j = j + 1
# for i in range(0,len(Data)):
#   print(Data[i])
with open('output.csv', 'w', newline='') as outputfile:
writedata = csv.writer(outputfile, delimiter=';')
for i in range(0, len(Data)):
writedata.writerow(Data[i]);

但是并没有真正使用pandas,这可能会给我更多处理数据的能力。此外,这个open()命令在非ascii字符方面有问题,我无法解决。

是否有更优雅的方式使用pandas?

所以基本上你在做一个"部分转置"。这是你想要的吗(参考这个答案)?

示例数据每行行数不等

ID  col1  col2
0  A   1.0   2.0
1  A   3.0   4.0
2  B   5.0   NaN
3  B   7.0   8.0
4  B   9.0  10.0
5  B   NaN  12.0

import pandas as pd
import io
# read df
df = pd.read_csv(io.StringIO("""
ID   col1    col2
A      1      2
A      3      4
B      5      nan
B      7      8
B      9      10
B      nan    12
"""), sep=r"s{2,}", engine="python")
# solution
g = df.groupby('ID').cumcount()
df = df.set_index(['ID', g]).unstack().sort_index(level=1, axis=1)
df.columns = [f'{a}_{b+1}' for a, b in df.columns]
结果

print(df)
col1_1  col2_1  col1_2  col2_2  col1_3  col2_3  col1_4  col2_4
ID                                                                
A      1.0     2.0     3.0     4.0     NaN     NaN     NaN     NaN
B      5.0     NaN     7.0     8.0     9.0    10.0     NaN    12.0

.set_index(["ID", g])步骤之后,数据集变成

col1  col2
ID              
A  0   1.0   2.0
1   3.0   4.0
B  0   5.0   NaN
1   7.0   8.0
2   9.0  10.0
3   NaN  12.0

,其中多重索引对于df.unstack()是完美的。

最新更新