为数据框中的列行的值分配预定义的数字

时间:2018-09-23 18:04:51

标签: python pandas loops for-loop dataframe

让我说我有一个数据框

   C                 D
agree           Average
agree           agree
strongly agree  disagree
disagree        agree

我要做的是像这样为C列值分配数字?

 C  D
 1  3
 1  1
 2  0
 0  1

我可以将map用于单列,但是如果有多于一列,我该如何将值更改为数字而不用为每一列单独写(我知道我可以用于循环,但是问题是我在这里应用)

有人知道该怎么做吗?

我尝试使用for循环

def assignNumbers(df):


for i in df:

    dftest= df[i].map({'Average':3, 'Agree':1, 'Disagree':0, 'Strongly Agree':2})

return dftest

3 个答案:

答案 0 :(得分:1)

使用pd.factorize作为广义解决方案(例如,如果您不知道预先拥有多少个类别)。

pd.DataFrame(pd.factorize(df.values.T.reshape(-1,))[0].reshape(df.shape[1], -1), index=df.columns).T

    C   D
0   0   3
1   0   0
2   1   2
3   2   0

答案 1 :(得分:0)

一种方法是

df.replace({'Average': 3, 'agree': 1, 'disagree': 0, 'strongly agree': 2})

答案 2 :(得分:0)

您可以使用一种类别和cat.codes

df.unstack().astype('category').cat.codes.unstack(0)

   C  D
0  1  0
1  1  1
2  3  2
3  2  1

如果您确实想匹配输出,而不仅仅是为每个变量分配唯一的值,则可以创建一个CategoricalDtype并定义顺序。

from pandas.api.types import CategoricalDtype
cat = CategoricalDtype(
    categories=['disagree', 'agree', 'strongly agree', 'Average'], ordered=True
)

df.stack().astype(cat).cat.codes.unstack(1)

   C  D
0  1  3
1  1  1
2  2  0
3  0  1