我有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)
2条答案
按热度按时间ma8fv8wu1#
在python中不推荐文本变量,但可能的解决方案是使用
globals
例如我建议改为创建字典
df_lkup
为了避免它:oo7oh9g92#
您可以使用np.where(),请参见:https://numpy.org/doc/1.20/reference/generated/numpy.where.html
编辑:如果要对特定列执行此操作: