将列表导出为 pandas 数据框中的新列作为嵌套 for 循环的一部分
Exporting a list as a new column in a pandas dataframe as part of a nested for loop
我正在输入包含多列数据的多个电子表格。对于每个电子表格,找到每列的最大值。然后,对于列中的每个元素,将该元素除以该列的最大值。输出应该是按升序排列的列中每个元素的值(介于 0 和 1 之间)。这将附加到一个列表中,该列表应作为一列添加到源电子表格中。
目前,据我了解,除了最后一步外,嵌套循环运行正常。每列都添加到电子表格中,除了值是源电子表格的最后一列,而不是与每个单独列相关的值。
我尝试更改缩进以将代码级别与不同部分相关联(因为我认为这是问题所在)并尝试在数据框中移动附加列,但无济于事。
for i in distlist:
#listname = i[4:] + '_norm'
df2 = pd.read_excel(i,header=0,index_col=None, skip_blank_lines=True)
df3 = df2.dropna(axis=0, how='any')
cols = []
for column in df3:
cols.append(column)
for x in cols:
listname = x + ' norm'
maxval = df3[x].max()
print(maxval)
mylist = []
for j in df3[x]:
findNL = (j/maxval)
mylist.append(findNL)
df3[listname] = mylist
saveloc = 'E:/test/'
filename = i[:-18] + '_Normalised.xlsx'
df3.to_excel(saveloc+filename, index=False)
新列被添加到输出数据框中,带有与源电子表格中字段 headers 相关的定制标题,并根据 (listname) 重命名。这些新列中的每一列中的数据都是相同的,并且与电子表格中的最后一列相关。对我来说,它似乎每次都在覆盖值(就像遍历整个电子表格,而不是为每一列输出),并将其添加到电子表格中。
如有任何帮助,我们将不胜感激。我认为这很简单,但我还没有弄清楚...
如果我理解正确的话,你把事情搞得太复杂了。您不需要为此使用 for 循环。您可以简化您的代码:
# Make example dataframe, this is not provided
df = pd.DataFrame({'col1':[1, 2, 3, 4],
'col2':[5, 6, 7, 8]})
print(df)
col1 col2
0 1 5
1 2 6
2 3 7
3 4 8
现在我们可以使用 DataFrame.apply
并使用 add_suffix
为新列提供 _norm
后缀,然后将这些列连接到一个最终数据帧
df_conc = pd.concat([df, df.apply(lambda x: x/x.max()).add_suffix('_norm')],axis=1)
print(df_conc)
col1 col2 col1_norm col2_norm
0 1 5 0.25 0.625
1 2 6 0.50 0.750
2 3 7 0.75 0.875
3 4 8 1.00 1.000
非常感谢。我想我只是把它复杂化了。顺便说一下,我认为我的代码可能会做同样的工作,但因为值差异很小,所以并不显着。
感谢@Erfan 的帮助
我正在输入包含多列数据的多个电子表格。对于每个电子表格,找到每列的最大值。然后,对于列中的每个元素,将该元素除以该列的最大值。输出应该是按升序排列的列中每个元素的值(介于 0 和 1 之间)。这将附加到一个列表中,该列表应作为一列添加到源电子表格中。
目前,据我了解,除了最后一步外,嵌套循环运行正常。每列都添加到电子表格中,除了值是源电子表格的最后一列,而不是与每个单独列相关的值。
我尝试更改缩进以将代码级别与不同部分相关联(因为我认为这是问题所在)并尝试在数据框中移动附加列,但无济于事。
for i in distlist:
#listname = i[4:] + '_norm'
df2 = pd.read_excel(i,header=0,index_col=None, skip_blank_lines=True)
df3 = df2.dropna(axis=0, how='any')
cols = []
for column in df3:
cols.append(column)
for x in cols:
listname = x + ' norm'
maxval = df3[x].max()
print(maxval)
mylist = []
for j in df3[x]:
findNL = (j/maxval)
mylist.append(findNL)
df3[listname] = mylist
saveloc = 'E:/test/'
filename = i[:-18] + '_Normalised.xlsx'
df3.to_excel(saveloc+filename, index=False)
新列被添加到输出数据框中,带有与源电子表格中字段 headers 相关的定制标题,并根据 (listname) 重命名。这些新列中的每一列中的数据都是相同的,并且与电子表格中的最后一列相关。对我来说,它似乎每次都在覆盖值(就像遍历整个电子表格,而不是为每一列输出),并将其添加到电子表格中。
如有任何帮助,我们将不胜感激。我认为这很简单,但我还没有弄清楚...
如果我理解正确的话,你把事情搞得太复杂了。您不需要为此使用 for 循环。您可以简化您的代码:
# Make example dataframe, this is not provided
df = pd.DataFrame({'col1':[1, 2, 3, 4],
'col2':[5, 6, 7, 8]})
print(df)
col1 col2
0 1 5
1 2 6
2 3 7
3 4 8
现在我们可以使用 DataFrame.apply
并使用 add_suffix
为新列提供 _norm
后缀,然后将这些列连接到一个最终数据帧
df_conc = pd.concat([df, df.apply(lambda x: x/x.max()).add_suffix('_norm')],axis=1)
print(df_conc)
col1 col2 col1_norm col2_norm
0 1 5 0.25 0.625
1 2 6 0.50 0.750
2 3 7 0.75 0.875
3 4 8 1.00 1.000
非常感谢。我想我只是把它复杂化了。顺便说一下,我认为我的代码可能会做同样的工作,但因为值差异很小,所以并不显着。
感谢@Erfan 的帮助