pandas:在执行value_计数时,循环遍历许多列并对列应用不同的Map

5vf7fwbs  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(396)

我有100列的调查数据,我需要得到每列中所有值的频率。列值为0、1等,我想将其Map为“否”、“是”。其他列可能是0=“否”、1=“是”、3=“可能”等。这些只是示例,有许多列(例如调查问题)具有许多不同的Map。
我希望循环遍历列,并将Map应用到列,执行频率,并将结果输出到 Dataframe 。提前谢谢。
下面是一些虚拟调查数据。


# Main Survey Data

data = {'Name':['Tom', 'Sam', 'Trish', 'Sharon', 'Tony'], 'Age':[20, 21, 19, 18, 20], 'MH' : [0,0,1,2, 1]}
df = pd.DataFrame(data)

我有一套代码,上面有调查问题的所有Map。与此类似。

age_map = {18 : 'Very young', 19 : 'Young',  20 : 'Old',  21 : 'Very old'}
mh_map = {0 : 'No', 1 : 'Yes', 2 : 'Maybe'}

我还有一个dataframe用作查找表,显示列名和列链接到的Map。与此数据类似。


# Dataframe used as a look up table showing all the column names and the related map

lkup = {'col' : ['Age', 'MH'], 'map' : ['age_map', 'mh_map']}
df_lkup = pd.DataFrame(lkup)

显然,在几列上应用Map并执行计数和输出结果很容易,类似于此。

mh_res = pd.DataFrame(df['MH'].map(mh_map).value_counts().reset_index())
mh_res['Colname'] = 'MH'
mh_res.columns=['Value', 'Count', 'Colname']
print(mh_res)

但我有100列要循环。下面是我开始使用的代码,但我不知道如何从列表中获取.map(j)中的j值,该列表是一个没有引号的变量名。


# Get the list of columns and maps from the column/map lookup table

collist = df_lkup['col'].tolist()
maplist = df_lkup['map'].tolist()

# Loop through columns and maps

final_results = pd.DataFrame()

for i, j in zip(collist, maplist):
    result = pd.DataFrame(df[i].map(j).value_counts().reset_index())
    result['Colname'] = i
    result.columns=['Value', 'Count', 'Colname']
    final_results = final_results.append(result)

print(final_results)
ma8fv8wu

ma8fv8wu1#

在python中不推荐文本变量,但可能的解决方案是使用 globals 例如

for i, j in zip(collist, maplist):
    result = df[i].map(globals()[j]).value_counts().reset_index()
    result['Colname'] = i
    result.columns=['Value', 'Count', 'Colname']
    final_results = final_results.append(result)

我建议改为创建字典 df_lkup 为了避免它:

age_map = {18 : 'Very young', 19 : 'Young',  20 : 'Old',  21 : 'Very old'}
mh_map = {0 : 'No', 1 : 'Yes', 2 : 'Maybe'}

lkup = {'Age':age_map,'MH': mh_map}
print (lkup)
{'Age': {18: 'Very young', 19: 'Young', 20: 'Old', 21: 'Very old'}, 
 'MH': {0: 'No', 1: 'Yes', 2: 'Maybe'}}

final_results = pd.DataFrame()

for i, j in lkup.items():
    result = df[i].map(j).value_counts().reset_index()
    result['Colname'] = i
    result.columns=['Value', 'Count', 'Colname']
    final_results = final_results.append(result)

print(final_results)
        Value  Count Colname
0         Old      2     Age
1       Young      1     Age
2    Very old      1     Age
3  Very young      1     Age
0         Yes      2      MH
1          No      2      MH
2       Maybe      1      MH
oo7oh9g9

oo7oh9g92#

您可以使用np.where(),请参见:https://numpy.org/doc/1.20/reference/generated/numpy.where.html

df = pd.DataFrame(np.where(df == 0, "No", df))
df = pd.DataFrame(np.where(df == 1, "Yes", df))
df = pd.DataFrame(np.where(df == 3, "Maybe", df))

编辑:如果要对特定列执行此操作:

df["col_name"] = pd.DataFrame(np.where(df["col_name"] == 0, "No", df["col_name"]))

相关问题