如何解决pandas/python:通过迭代替换数据帧中的分类值
我创建了一个数据库,我试图用一些数值代替分类变量 我通过“枢轴”计算的。在我的代码中,我试图遍历整个数据框,如果数据框分类列单元格与“sublist_names”中的元素之一具有相同的值,则它们应替换为位于同一位置的“sublist_values”中的元素作为子列表名称中的值。 例如,在迭代数据框和每个分类列时,名为“Name”的列的第一个值是字符串“tom”。 'tom' 正好是 'sublist_names' 中的第 7 个元素,这意味着它应该替换为 'sublist_values' 中的第 7 个元素,即等于 150。
我能够获得所有需要的值,但是当涉及到通过迭代整个数据框而不是逐列工作来解决最后一个任务时,我不知道该怎么做。 我希望我解释清楚,但如有任何问题,请随时提出。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
data = [['tom',10,6,'brown',200],['nick',15,5.10,'red',150],['juli',14,5.5,'black',170],['peter','blue',290],['axel','yellow',190],['william',['tom','orange',100],['angela',160],'purple',220],['aroon',170] ]
df = pd.DataFrame(data,columns=['Name','Age','height','color','weight'])
categorical_variables= (df.select_dtypes('object') ) # categorical variables
categ_var_list=(list(categorical_variables))
print(categ_var_list)
condition_pivot_list_names=[]
pivot_values_list=[]
for i in categ_var_list:
condition_pivot = df.pivot_table(index=i,values='weight',aggfunc=np.mean)
pivot_names = (condition_pivot.index.values.tolist())
condition_pivot_list_names.append(pivot_names)
pivot_values_draft = ((condition_pivot.values.tolist()))
pivot_values = [i[0] for i in pivot_values_draft]
pivot_values_list.append(pivot_values)
print(condition_pivot_list_names,'condition pivot list names')
print(pivot_values_list,'pivot values list')
sublist_names=[(sublists) for sublists in condition_pivot_list_names]
print(sublist_names)
sublist_values=[(sublists1) for sublists1 in pivot_values_list]
print(sublist_values)
def myfunc(x):
if x in sublist_names:
index=sublist_names.index(x)
return sublist_values[index]
return x
df['Name'] = df['Name'].apply(lambda x: myfunc(x))
print(df['Name'])
这是 print( df[name]) 显示的: 0 汤姆 1 个缺口 2 月 3 彼得 4 轴 5 威廉 6 汤姆 7 汤姆 8 安吉拉 9 彼得 10 缺口 11月
0 150 1 150 2 170 3 255 4 190 5 170 6 150 7 150 8 160 9 255 10 150 11 170
解决方法
您有两个分类值名称和颜色。所以你可以做这样的事情。
df['Name'] = df['Name'].apply(lambda x: myfunc(x))
然后你可以创建一个函数 myfunc() 从上面的代码中接收 x 。上面的代码所做的是,它会一一遍历列,并将每一行的值一一传递给函数。在函数内部,您可以定义转换分类值的逻辑
def myfunc(x):
if x in sublist_names:
index=sublist_names.index(x)
return sublist_values[index]
return x
对列 Color 执行相同的操作。
,试试这个:
df.Name = np.where(df.groupby('Name',as_index=False)['Name'].cumcount().eq(0),df.Name,df.weight)
输出:
Name Age height color weight
0 tom 10 6.0 brown 200
1 nick 15 5.1 red 150
2 juli 14 5.5 black 170
3 peter 10 6.0 blue 290
4 axel 15 5.1 yellow 190
5 william 14 5.5 yellow 170
6 100 10 6.0 orange 100
7 150 15 5.1 brown 150
8 angela 14 5.5 black 160
9 220 10 6.0 purple 220
10 150 15 5.1 orange 150
11 aroon 14 5.5 red 170
,
好的,我明白你的问题了。只需在函数声明之前编写以下代码即可。
sub_names=[]
sub_values=[]
for i in sublist_names:
sub_names.extend(i)
for i in sublist_values:
sub_values.extend(i)
同样不要忘记更新 myfunc() 中的变量名。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。