清理数据:使用在“词典”中映射的值替换当前列值

时间:2016-03-21 01:35:44

标签: python list python-2.7 dictionary iteration

我一直试图将这个问题包围起来一段时间,但还没有找到解决方案。

我的问题是如果符合条件,如何根据列名更改多列中的当前列值?

我的调查数据已作为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.

非常感谢任何有关为什么不起作用或更有效的方法的建议/建议

1 个答案:

答案 0 :(得分:0)

因此,如果我理解您的问题,您想要使用1,2,3,4,5替换列中的所有内容,具体取决于列名称?

我认为您需要做的就是遍历您的列表并通过您的dict返回的值重复多次:

for col in op_cols:
    df[col] = df[col]*op_dict[col]

这就是你所描述的,并且远比更换每个值快得多。 NaNs仍然是NaNs,如果你愿意,你可以用fillna处理循环中的那些。