目标是根据条件重命名数据框的列并修改相应列的值。
df1 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'eTIV': [1.12, 2.22, 3.43, 5.43], })
df2 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Ear_Vol': [5, 6, 7, 8]})
df3 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Nose': [1, 2, 3, 5], })
df4 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Eye_Vol': [1, 2, 3, 5], })
df5 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Finger': [1.3, 2.123, 3.4, 5.5], })
dfs = [df1, df2, df3, df4,df5]
df_final = reduce(lambda left,right: pd.merge(left,right,on='ID'), dfs)
df_final
ID eTIV Ear_Vol Nose Eye_Vol Finger
0 Mary 1.12 5 1 1 1.300
1 Mike 2.22 6 2 2 2.123
2 Barry 3.43 7 3 3 3.400
3 Scotty 5.43 8 5 5 5.500
df_final.columns = df_final.columns.str.replace(r"_Vol", "_Vol_Adj")
df_final_Adj = pd.DataFrame(数据= df_final,列= df_final.columns) df_final_Adj
ID eTIV Ear_Vol_Adj Nose Eye_Vol_Adj Finger
0玛丽1.12 5 1 1 1.300 1麦克2.22 6 2 2 2.123 2巴里3.43 7 3 3 3.400 3斯科蒂5.43 8 5 5 5.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'"
方法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'
答案 0 :(得分:0)
假设OP中显示的图像是在应用功能eTIV_Adjust
之前 的数据,这是我的尝试
根据操作说明生成数据
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
现在,此行if 'Vol' in key:
建议您查找包含部分字符串'Vol'
的列。您可以使用.str.contains
来搜索这些列,而无需使用iterrorws
或.apply
(如@Andy Hayden上面建议的那样)
cols = df.columns[df.columns.str.contains('Vol')].tolist()
print(cols)
['two_Volume', 'four_Volume']
现在,只需将这些列除以名为five
的列(请参阅this helpful SO post)
df[cols] = df[cols].div(df['five'], axis=0)
print(df)
one two_Volume three four five six four_Volume
0 1 0.2 5 1 5 5 1.0
1 1 0.2 5 1 5 5 1.0
2 1 0.2 5 1 5 5 1.0
3 1 0.2 5 1 5 5 1.0
4 1 0.2 5 1 5 5 1.0
答案 1 :(得分:0)
此方法有效:
for col in cols:
df_final_Adj[col] = df_final_Adj[col].div(df_final_Adj['eTIV'], axis=0)
df_final_Adj