Pandas Concat到列上的多索引



已经玩了一段时间了。我正在处理测试数据,其中我有一系列测试点,一系列传感器,对于每个传感器,我都有min/max/avg/stdev数据。

我曾考虑过简单地附加例如"_min";并创建nColumns*3宽度的数据帧。但是这感觉很笨拙——当我调用来绘制变量时,我将不得不处理字符串值来添加后缀…感觉很笨拙。

多索引似乎是正确的方法,这将允许我单独处理传感器名称和测量。

我目前正在读取的数据如下:

data = pd.read_excel(os.path.join(working_path, working_dir, staticDataFileName), 
sheet_name='sheet', skiprows = 6, nrows=2000,  usecols = 'A,D:G', names = ["Tag", "Min", "Max", "Avg", "Stdev"], dtype={'Tag': str})

然后,我将数据帧拆分为每个单独的变量。

df_min = data[["Tag", "Min"]]
...

我目前有一些代码,我只有一个平均值。

temp = readRawData(wd, f, dataset)
# Drop the bad rows
temp.drop(temp.index[temp['Tag'] == '0'], inplace = True)
temp2 = temp.T
temp2.rename(columns=temp2.iloc[0], inplace = True)
temp2.drop(temp2.index[0], inplace = True)

我需要转换数据帧以将标记名设置为列,然后将列设置为标记名。然后我删除第一个索引,现在它只是标签名称。在我的代码中,我循环遍历所有文件,并使用为所有数据点创建数据帧

data = pd.concat([data, temp2])

在那里的某个地方,我需要弄清楚如何创建这个多索引数据帧。pandas用户指南LINK中给出的大多数示例的索引都是多级的,而不是列。他们举的例子。。我很难跟上。

我正在寻找如何获取一系列看起来像的数据帧的指导

df_min
Tag1   Tag2  TagN
0  min1   min2  minN
df_avg
Tag1   Tag2  TagN
0  avg1   avg2  avgN

并将它们组合成

df
Tag1                 Tag2     ...      TagN
Min   Max Avg    Min   Max  Avg      Min Max Avg 
0  min1 max1 avg1   min2 max2 avg2      minN maxN avgN

当然,这是一个糟糕的主意,请告诉我。谢谢

我能够通过使用这里的解决方案来实现这一点:https://stackoverflow.com/a/47338266/14066896

它不漂亮。。。但它似乎在上工作

for f in staticDataFileName:

temp_all = readRawData(wd, f)
temp_all.drop(temp_all.index[temp_all['Tag'] == '0'], inplace = True)

column_list = []
steady_dict = dict()
temp = temp_all.T
temp.rename(columns=temp.iloc[0], inplace=True)
temp.drop(temp.index[0], inplace=True)
temp.reset_index(inplace=True)
temp.drop(columns=['index'], inplace=True)
#create column names 
for column in temp.columns:
column_list.append((column, "Min"))
column_list.append((column, "Max"))
column_list.append((column, "Avg"))
column_list.append((column, "Stdev"))
j = 0
for columnName, columnData in temp.iteritems():
temp_dict = dict()
temp_dict["Min"] = temp.iloc[0, j]
temp_dict["Max"] = temp.iloc[1, j]
temp_dict["Avg"] = temp.iloc[2, j]
temp_dict["Stdev"] = temp.iloc[3, j]
j += 1
steady_dict[columnName] = temp_dict

t = pd.DataFrame(steady_dict).unstack().to_frame().T           
t.columns = pd.MultiIndex.from_tuples(column_list)
#correctStaticData(temp2, wd2)

data = pd.concat([data, t])           

最新更新