【问题标题】:pandas/python: replacing categorical values in dataframe through iterationpandas/python:通过迭代替换数据框中的分类值
【发布时间】:2021-03-05 12:29:21
【问题描述】:

我创建了一个数据库,并尝试用一些数值替换分类变量 我通过“枢轴”计算出来的。在我的代码中,我试图遍历整个数据框,如果数据框分类列单元格与“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', 10,6,'blue',290],
    ['axel', 15,5.10,'yellow',190],
    ['william', 14,5.5,'yellow',170]
    ,['tom', 10,6,'orange',100],
    ['tom', 15,5.10,'brown',150],
    ['angela', 14,5.5,'black',160]
    ,['peter', 10,6,'purple',220],
    ['nick', 15,5.10,'orange',150],
    ['aroon', 14,5.5,'red',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

【问题讨论】:

  • 您的意思是即使color 相同,您也想用对应的weight 值替换它?
  • 不,我正在尝试将数据框中的“sublist_names”中的分类值替换为“sublist_values”中的相应条目。例如,如果我想替换“名称”列中的名称“tom”,tom 位于“sublist_names”中第一个子列表的第 7 个条目,所以它应该替换为“150”第一个的第 7 个条目'sublist_values' 中的子列表。
  • 如果你想得到答案,你需要向其他愿意帮助你的用户提供这两个东西:1.这是数据的样子 2.这是结果 I(你!)正在寻找。

标签: python pandas dataframe iteration


【解决方案1】:

您有两个分类值名称和颜色。所以你可以做这样的事情。

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

对颜色列执行相同的操作。

【讨论】:

  • 你的代码运行的唯一方法是如果 df['Name'] = df['Name'].apply(lambda x: myfunc(x)) 出现在函数之后,而不是之前,这并不奇怪,因为 myfunc 需要在使用前声明。尽管运行,此代码将 df[,Name'] 中的每个值替换为 'sublist-values' 中的所有值,而不仅仅是一个。
  • 是的,你必须在使用它之前声明一个函数,因为python从上到下解析代码。因此,您不能在声明之前调用函数。此外,在您运行代码时分享您的输出,并分享数据的样子。
  • 我刚刚用您的建议及其输出以及输出应该是什么来编辑主要问题。很抱歉,但我不知道如何正确包含输出。我希望我的最后一次编辑有所帮助。
【解决方案2】:

试试这个:

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

【讨论】:

  • 如果你愿意,你也可以对color 列做同样的事情。
【解决方案3】:

好的,我看到了您的问题。只需在函数声明前编写以下代码即可。

sub_names=[]
sub_values=[]

for i in sublist_names:
    sub_names.extend(i)

for i in sublist_values:
    sub_values.extend(i)

别忘了更新 myfunc() 中的变量名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2017-01-04
    • 2023-01-14
    • 2017-06-15
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多