如何使用字典将计算结果添加到数据框中?

时间:2021-04-26 15:07:06

标签: python pandas dataframe append

我遇到以下问题:尝试将“time”和“y_corrected”添加到新数据框中时出错。

我需要计算一个变量“y_corrected”,并将其添加到一个新的数据帧中。为了计算这个变量,我使用 group 函数根据两个条件循环遍历数据集:文件名和处理。最终的数据帧应包含文件名、治疗、时间、y_corrected。

file = pd.read_excel(r'C:.....xlsx')
grouped = file.groupby(['File name', 'Treatment'])

########################################  output dataframe #####################################
new = pd.DataFrame(columns=['File name','Treatment', 'Time', 'y_corrected'])
new.columns = ['File name', 'Treatment', 'Time', 'y_corrected']

######################################## correction ########################################
for key, g in grouped:
  a = g['y'].max()
  b = g['y'].min()

  y_corrected = (g['y'] - b) / a

  row = {'File name': key[0], 'Treatment': key[1],  'Time': time[2], 'y_corrected': y_corrected[3]}
  new = new.append(row, ignore_index=True)

print(new)

这是错误: 结果 = self.index.get_value(self, key)

3 个答案:

答案 0 :(得分:0)

对于快速解决方案,您可以尝试将值作为列表传递到“行”对象中,我之前在使用 dataframe.append() 时遇到了一些类似的问题。例如:

row = {'File name': [key[0]], 'Treatment': [key[1]] ....

答案 1 :(得分:0)

因为 g['y'] 是一个系列,所以 y_corrected 也是一个等于一组长度的系列。

y_corrected = (g['y'] - b) / a

y_corrected[3] 不起作用。您应该再次遍历这些值以获取行值(我省略了“时间”,因为这似乎与问题无关)。

import pandas as pd

df = pd.DataFrame([['A', 'Z', 1.0],
                     ['A', 'Z', 0.5],
                     ['A', 'Y', 1.5],
                     ['A', 'Y', 0.5],
                     ['B', 'Z', 1.0],
                     ['B', 'Z', 0.5],
                     ['B', 'Y', 1.5],
                     ['B', 'Y', 0.5],
                     ],
                    columns=['File name', 'Treatment', 'y']
                    )
grouped = df.groupby(['File name', 'Treatment'])

########################################  output dataframe #####################################
new = pd.DataFrame(columns=['File name', 'Treatment', 'y_corrected'])
new.columns = ['File name', 'Treatment', 'y_corrected']

######################################## correction ########################################
for key, g in grouped:
    a = g['y'].max()
    b = g['y'].min()

    y_corrected = (g['y'] - b) / a

    for idx, y_corrected_ in y_corrected.items():
        row = {'File name': key[0], 'Treatment': key[1], 'y_corrected': y_corrected_}
        new = new.append(row, ignore_index=True)

解决此问题的更简单方法是直接对您的组执行操作。

def correction(s):
    return (s - s.min()) / s.max()

df['y_corrected'] = grouped.apply(correction)

print(df)

给出:

  File name Treatment    y  y_corrected
0         A         Z  1.0     0.500000
1         A         Z  0.5     0.000000
2         A         Y  1.5     0.666667
3         A         Y  0.5     0.000000
4         B         Z  1.0     0.500000
5         B         Z  0.5     0.000000
6         B         Y  1.5     0.666667
7         B         Y  0.5     0.000000

答案 2 :(得分:0)

您不必遍历不同的组。你只需要在你的数据框上使用 pandas 魔法:

file = pd.read_excel(r'C:.....xlsx')

file['y_corrected'] = file.groupby(['File name', 'Treatment'])['y'].apply(lambda x: (x-min(x))/max(x))