我一直试图将这个问题包围起来一段时间,但还没有找到解决方案。
我的问题是如果符合条件,如何根据列名更改多列中的当前列值?
我的调查数据已作为pandas csv数据框读入:
import pandas as pd
df = pd.read_csv("survey_data")
如果当前列值等于1,我已经创建了一个包含列名和每列所需值的字典。每列包含1或NaN。基本上数据框中的任何列以'_SA'= 5,'_ A'= 4,'_ NO'= 3,'_ D'= 2和'_SD'保持为当前值1.所有'NaN'值保持原样。这是字典:
op_dict = {
'op_dog_SA':5,
'op_dog_A':4,
'op_dog_NO':3,
'op_dog_D':2,
'op_dog_SD':1,
'op_cat_SA':5,
'op_cat_A':4,
'op_cat_NO':3,
'op_cat_D':2,
'op_cat_SD':1,
'op_fish_SA':5,
'op_fish_A':4,
'op_fish_NO':3,
'op_fish_D':2,
'op_fish__SD':1}
如果当前列值= 1 [op_cols],我还创建了数据框中我想要更改的列的列表。现在我一直在尝试使用这样的东西来迭代这些列中的值,并用字典中的映射值替换1:
for i in df[op_cols]:
if i == 1:
df[op_cols].apply(lambda x: op_dict.get(x,x))
df[op_cols]
它没有吐出错误,但它没有用字典中的相应值替换1值。它仍然是1.
非常感谢任何有关为什么不起作用或更有效的方法的建议/建议
答案 0 :(得分:0)
因此,如果我理解您的问题,您想要使用1,2,3,4,5替换列中的所有内容,具体取决于列名称?
我认为您需要做的就是遍历您的列表并通过您的dict返回的值重复多次:
for col in op_cols:
df[col] = df[col]*op_dict[col]
这就是你所描述的,并且远比更换每个值快得多。 NaNs仍然是NaNs,如果你愿意,你可以用fillna处理循环中的那些。