让我说我有一个数据框
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
答案 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