Python 3.x 如何将此迭代应用于数据帧以修改它?
目标是根据条件重命名数据框的列,并修改相应列的值 合并多个数据帧 更改列名 df_final_Adj=pd.DataFrame(data=df_final,columns=df_final.columns) 最后的Python 3.x 如何将此迭代应用于数据帧以修改它?,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,目标是根据条件重命名数据框的列,并修改相应列的值 合并多个数据帧 更改列名 df_final_Adj=pd.DataFrame(data=df_final,columns=df_final.columns) 最后的 ID eTIV Ear_Vol_Adj Nose Eye_Vol_Adj Finger 0玛丽1.125 11.300 1麦克2.22 6 2.123 2巴里3.4373400 3斯科蒂5.43 85.500 更改包含标题“_Adj”的列的值 cols = d
ID eTIV Ear_Vol_Adj Nose Eye_Vol_Adj Finger
0玛丽1.125 11.300
1麦克2.22 6 2.123
2巴里3.4373400
3斯科蒂5.43 85.500
更改包含标题“_Adj”的列的值
cols = df_final_Adj.columns[df_final_Adj.columns.str.contains('_Adj')].tolist()
print(cols)
['Ear_Vol_Adj', 'Eye_Vol_Adj']
方法1:
df_final_Adj[col] = df_final_Adj[col].div(df_final_Adj['eTIV'], axis=0)
错误:
TypeError: unsupported operand type(s) for /: 'str' and 'int'"
TypeError: unsupported operand type(s) for /: 'str' and 'int'
方法2:
for col in cols:
df_final_Adj[col] = df_final_Adj[col].div(df_final_Adj['eTIV'], axis=0)
错误:
TypeError: unsupported operand type(s) for /: 'str' and 'int'"
TypeError: unsupported operand type(s) for /: 'str' and 'int'
假设OP中显示的图像是应用函数
eTIV_Adjust
之前的数据,下面是我的尝试
根据OP描述生成数据
d = [['one', 'two_Volume', 'three', 'four', 'five', 'six', 'four_Volume'],
[1,1,5,1,5,5,5],
[1,1,5,1,5,5,5],
[1,1,5,1,5,5,5],
[1,1,5,1,5,5,5],
[1,1,5,1,5,5,5]]
df = pd.DataFrame(d[1:], columns=d[0])
print(df)
one two_Volume three four five six four_Volume
0 1 1 5 1 5 5 5
1 1 1 5 1 5 5 5
2 1 1 5 1 5 5 5
3 1 1 5 1 5 5 5
4 1 1 5 1 5 5 5
现在,如果key:中的'Vol',这一行表明您正在查找包含部分字符串的列'Vol'
。您可以使用来搜索这些列,而无需使用iterrows
或。使用此方法应用
(如上面@Andy Hayden所建议的)
cols = df.columns[df.columns.str.contains('Vol')].tolist()
print(cols)
['two_Volume', 'four_Volume']
现在,将这些列除以名为five
的列(请参阅)
这种方法在以下方面起作用:
for col in cols:
df_final_Adj[col] = df_final_Adj[col].div(df_final_Adj['eTIV'], axis=0)
df_final_Adj
你能举个例子吗,我觉得举个例子会容易得多。我相当肯定,您可以不使用apply或iteritems,仅使用loc来完成此操作。编辑版本中添加了一个示例。但实际的数据帧会大得多,具有不同的值,但需要相同的更改。请粘贴打印输出(df.to_字符串)而不是使用屏幕截图?请提供源数据的示例。例如,df.head()
问题已相应编辑。感谢您的反馈!我根据一些评论修改了问题以澄清。您的方法基本上是有效的,但是,我对您建议的最后一个组件有问题-请参阅我修改的问题中的最后两条错误消息。@arkadiy,检查包含\u Vol\u Adj
的两列中是否不包含字符串。如果它们确实应该是整数,那么听起来您对数据类型有问题。在循环的之前尝试df_final_Adj[cols]=df_final_Adj[cols].astype(int)
。
for col in cols:
df_final_Adj[col] = df_final_Adj[col].div(df_final_Adj['eTIV'], axis=0)
df_final_Adj